Promise 用es5的基础实现
只实现 then 和 catch
function promise(fn) {
var state = 'pending';
// 声明函数
var nowResolve = function (arg) { return arg };
var nowReject = function (arg) { return arg };
var nextResolve = function (arg) { return arg };
var nextReject = function (arg) { return arg };
var catchReject = function (e) { throw e + ' (in promise)' };
promise.prototype.then = function (res, rej) {
typeof res === 'function' ? nowResolve = res : '';
typeof rej === 'function' ? nowReject = rej : '';
// return 新的对象
return new promise(function (resolve, reject) {
// then 中 return 的值传递给下一个 resolve/reject
nextResolve = resolve;
// 如果 then 中有 reject 回调函数, 则将 return 的值传递给下一个 resolve, 否则继续传递给reject
nextReject = typeof rej === 'function' ? resolve : reject;
// 捕获错误的回调函数
catchReject = reject;
});
}
promise.prototype.catch = function (fn) {
return this.then(null, fn);
}
// 传值到下一个回调,以及异常捕获
function tryCatchFn(state, arg) {
try {
state === 'fulfilled' ? nextResolve(nowResolve(arg)) : nextReject(nowReject(arg));
} catch (e) {
catchReject(e);
}
}
function callback(value) {
return function (arg) {
if (state !== 'pending') { return; }
state = value;
// 如果传参是 promise 构造器生成的对象,传递对象 resolve 的值
if (arg instanceof promise) {
arg.then(function (res) {
tryCatchFn('fulfilled', res);
}, function (rej) {
tryCatchFn('rejected', rej);
});
return;
}
// 如果是普通的传值,setTimeout 是为了 resolve/reject 同步代码的时候正常工作
setTimeout(function () {
tryCatchFn(state, arg);
});
}
}
fn(
callback('fulfilled'),
callback('rejected')
);
}
Promise 用es5的基础实现的更多相关文章
- ES5 & ES6 基础
一.什么是ES5 附上一览表 (5.1中文 (2011.6)): http://lzw.me/pages/ecmascript/ (5.1英文PDF):http://www.ecma-internat ...
- JavaScript面向对象轻松入门之概述(demo by ES5、ES6、TypeScript)
写在前面的话 这是一个JavaScript面向对象系列的文章,本篇文章主要讲概述,介绍面向对象,后面计划还会有5篇文章,讲抽象.封装.继承.多态,最后再来一个综合. 说实话,写JavaScript面向 ...
- Promise杂记
更好的阅度体验 前言 API Promise特点 状态跟随 V8中的async await和Promise 实现一个Promise 参考 前言 作为一个前端开发,使用了Promise一年多了,一直以来 ...
- Promise实践
一.概念 Promise是异步编程的解决方案之一,与事件驱动+回调函数并列. Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状 ...
- 分步理解 Promise 的实现
一个 Promise 的运用: var firstPromise = new Promise(function(resolve,reject){ setTimeout(function(){ var ...
- Promise API
Promise API 刚刚接触promise这个东西,网上看了很多博客,大部分是讲怎么用Promise,丝毫没提怎么实现Promise. 我不甘 心,可是真去看JQuery或者Angular ...
- 45道Promise面试题
来看看通过阅读本篇文章要点: Promise的几道基础题 Promise结合setTimeout Promise中的then.catch.finally Promise中的all和race async ...
- 从C#到TypeScript - async await
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- Axios 的基本使用
Axios 是一个基于 promise 的HTTP 库, 可以用在浏览器和 node.js 中. 1. 从浏览器创建 XMLHttpRequests 2. 从node.js 创建 http 请求 3. ...
随机推荐
- centos6 启动流程
具体过程:1)加载BIOS的硬件信息,执行BIOS内置程序.2)读取MBR(Master Boot Record)中Boot Loader中的引导信息.3)加载内核Kernel boot到内存中.4) ...
- eclipse安装WTP部署WEB项目
打开WTP官方安装指南,找到想要的下载站点 http://wiki.eclipse.org/WTP_FAQ#How_do_I_install_WTP.3F 我选择的是http://download.e ...
- Spring pom配置详解(转)
转载至http://blog.csdn.net/ithomer/article/details/9332071# 原博主注释的很详细 <project xmlns="http://ma ...
- JavaScript学习系列6 -- JavaScript中的垃圾回收(内存释放)
程序开发中,涉及到的内存生命周期基本是一样的,分为以下三步 1. 分配需要的内存 2. 使用分配到的内存 3. 释放其内存 ----什么时候释放内存,以及需要释放哪些变量的内存, 就是垃圾回收机 ...
- 5.SSRF服务器端请求伪造
SSRF(服务端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞. 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正是因为它是由服务端发起的,所以它能够请求到与它相连而与 ...
- UVa 11020 Efficient Solutions (BST)
题意:给按顺序给定 n 个人群,用x和y来描述,如果有没有任何一个x' < x y' <= y 或 x '<= x y' <= y,那么这个群体就是优势群体, 让你求出每放入一 ...
- SQL查询 若为空显示默认值
COALESCE(a.end_,now()) SELECT COALESCE(NULL,NULL,3,4,5) FROM
- 1.jQuery入口函数 与javaScript入口函数
1.jQuery入口函数 与javaScript入口函数 JQ入口函数: $(document).ready(function(){ }); 或者 $(function(){ }) Js入口函数: w ...
- webconfig连接数据库配置
<connectionStrings> <add name="sqlConnection" connectionString="server=----- ...
- Java中Class Type 类类型是怎么回事?
Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ...