谈谈Promise那点事(一)
随着es6流行 Promise使用非常的广泛 那那都是Promise 异步请求返回一个Promise对象,Generator 中 yield 后面一般跟 Promise 对象, 等等到处都是Promise 我们真的搞明白了? 我们来简单唠唠
Promise的规范
一个Promise 有三种状态等待(pending)、已完成(fulfilled)、已拒绝(rejected)
一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
- 一个Promise 有一个then方法
接收两个可选函数参数onFulfilled、onRejected而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
Promise的API
- 实例的方法
.then(resolvedFn, rejectFn)方法 .then 为Promise添加一个状态改变时候的回调 返回值一个新Promise的实例
.catch()方法 返回值也是一个Promise对象 Promise对象的错误具有冒泡性质 错误一直往后面传递 知道一直被这个 catch捕获 正因为 这些实例方法都是Promise对象 所以可以通过链式调用 静态的方法
Promise.resolve()方法将对象转为Promise对象比如
var jsPromise = Promise.resolve($.ajax('/whatever.json')); Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo'))复制代码
Promise.resolve() 方法参数有四种情况
- 如果参数是Promise实例 那返回也就是就是这个实例
如果返回时thenable 对象(含有then的对象) 则先将其转换为promise对象,然后立即执行这个对象的then方法
let thenable = { then: function(resolve, reject) { resolve(42); } } let p1 = Promise.resolve(thenable); p1.then(function(value) { console.log(value); // 42 });复制代码
如果参数是个原始值,则返回一个promise对象,状态为resolved,这个原始值会传递给回调
var p = Promise.resolve('Hello'); p.then(function (s){ console.log(s) }); // Hello复制代码
没有参数,直接返回一个resolved的Promise对象
var p = Promise.resolve(); p.then(function () { // ... }); 这里p 就是Promise对象复制代码
Promise.reject()方法
同上,不同的是返回的promise对象的状态为rejectedPromise.all()方法
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。var p = Promise.all([p1, p2, p3]);复制代码
这里参数是数组 p123都是Promise实例 如果不是Promise实例 会用到Promise.resolve() 转为Promise实例
- 如果全部成功,状态变为resolved,返回值将组成一个数组传给回调
- 只要有一个失败,状态就变为rejected,返回值将直接传递给回调
- 返回值也是个Promise实例
// 生成一个Promise对象的数组 var promises = [2, 3, 5, 7, 11, 13].map(function (id) { return getJSON('/post/' + id + ".json"); }); Promise.all(promises).then(function (posts) { // ... }).catch(function(reason){ // ... });复制代码
上面解释下 Promises是包含6个promise实例的数组 这6个都变成都成功fulfilled 或者其中一个失败rejected 都会调用all方法 后面回调函数
这里注意下若果自己定义了catch 捕获 那么在all里面是捕获不到的
- 实例的方法
Promise.race()方法
- 同上,区别是,只要有一个Promise实例率先发生变化(无论是状态变成resolved还是rejected)都触发then中的回调,返回值将传递给回调
- race()的返回值也是新的Promise对象
Promise初尝一
参考链接ECMAScript 6 入门(阮一峰)