前言
阅读本文需要对promise有一定了解,可阅读详解promise
Promise标准解读
1.只有一个then
方法,没有catch
,race
,all
等方法,甚至没有构造函数
Promise标准中仅指定了Promise对象的`then`方法的行为,其他常见的方法/函数都没有指定,包括`catch`,`race`,`all`等常用方法,甚至也没有指定该乳环构造一个Promise对象,而且`then`也没有一般实现中(Q,$q等)所支持的第三个参数,一般成为onProgress
2.then
方法返回一个新的Promise
Promise的`then`方法返回一个新的Promise,而不是返回this,此处下文会有更多解释
1
2
promise2 = promise1.then(alert);
promise2 != promise1 //true
3.不同Promise的实现需要可以相互调用(interoperable)
4.Promise的初始状态为pending,它可以由此状态转换为fulfilled(也叫resolved)或者rejected,一旦状态确定,就不可以再转换为其他状态,状态确定的过程成为settle
5.更具体的标准
一步一步实现一个Promise
一步一步实现一个Promise
构造函数
标准中并没由指定如何构造一个Promise对象,在此以实现Promise的通用方法来构造一个Promise对象,即ES6原生Promise里所使用的方法:
1 | //Promise构造函数接收一个executor函数,execuyor函数执行完同步或者异步操作后,调用它的两个参数resolve和reject |
先实现构造函数的框架:
1 | function Promise(executor) { |
上面代码基本实现了Promise构造函数的主体,但还是有两个问题:
1.我们给executor函数传了两个参数:resolve和reject,这两个参数尚未定义
2.executor也有可能出错(throw),此时,Promise应该被其throw出的值reject:
1 | new Promise(function(resolve, reject) { |
所以我们需要在构造函数里定义resolve和reject这两个函数:
1 | function Promise(executor) { |