promise初始
Promise 是异步编程的一种解决方案,Promise 可以认为是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。具有两大特点:
- 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败),只有promise执行的结果可以影响当前状态,无论是异步操作还是同步操作。
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。
基本用法
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
new Promise(
/* executor */
function(resolve, reject) {...}
);
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。看一个实例:
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('resolved.');
});
console.log('Hi!');
// Promise
// Hi!
// resolved
可以看到,在new promise的时候,会立即执行promise构造函数中的参数function,也就是包含resolve、reject两个方法的函数会被立即执行,上面代码中,Promise 新建后立即执行,所以首先输出的是Promise。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出。
注意:
1. promise的参数函数中如果resolve、reject这两个函数中的某个带了参数也是 promise的话,那么这个原本的promise的状态将会由参数中的promise的状态决定
2. resolve、reject并不会想return一样结束函数的运行
then方法
then方法是定义在原型对象Promise.prototype上的。它的作用是为 Promise 实例添加状态改变时的回调函数。then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数。then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。
// getJSON 是一个promise实例
getJSON("/posts.json").then(function(json) {
return json.post;
}).then(function(post) {
// ...
});
很多时候在then中会人为的书写一些异步操作,这样可以很好的链式调用,但是即使不是人为的异步操作,JavaScript也会自动的把then的返回值封装为promise实例,可以一直使用then无限回调。
catch方法
Promise.prototype.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定的回调函数,处理这个错误。另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
//getJSON 是一个promise
getJSON('/posts.json').then(function(posts) {
// ...
}).catch(function(error) {
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});
比较推荐的书写方法是先使用then来给promise添加resolve的回调,然后使用catch来捕获所有的链接上的reject或者异常。
promise.resolve理解
可以说Promise.resolve是唯一的把promise转换为完成状态的操作,Promise.resolve方法的参数分成四种情况:
- 参数是一个promise实例
如果参数是Promise实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。这个之前已经说过了,如果promise的的resolve参数带的是一个promise,那么原本promise的将会被丢弃,由这个新的promise的状态来取代 - 参数是一个thenable对象
thenable对象指的是具有then方法的对象,Promise.resolve方法会将这个对象转为Promise对象,然后就立即执行thenable对象的then方法。 - 参数不是具有then方法的对象,或根本就不是对象
如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的Promise对象,状态为resolved。 - 不带有任何参数
Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的Promise对象。
promise.reject理解
Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。
注意,Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。这一点与Promise.resolve方法不一致。
其他
- done()
Promise对象的回调链,不管以then方法或catch方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为Promise内部的错误不会冒泡到全局)。因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。 - done()
finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。它与done方法的最大区别,它接受一个普通的回调函数作为参数,该函数不管怎样都必须执行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。