promise对象总结
一.Promise是异步编程的一种解决方案,它是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。promise对象是一个构造函数,用来生成Promise实例;
二.promise的两个特点 对象状态不受外界影响 && 一旦状态改变,就不会再变,任何时候都可以得到结果(pending状态-->fulfilled || pending-->rejected)
基本用法 函数作为参数,该函数两个参数resolve和reject
const promise = new Promise(function(resolve,reject) { ... if(/*异步操作成功*/){ resolve(value) }else{ reject(error) } })
三.Promise方法
1.promise.prototype.then():Promise 实例添加状态改变时的回调函数,有两个参数resolve和reject的分别操作
一般来说,调用resolve
或reject
以后,Promise 的使命就完成了,后继操作应该放到then
方法里面,而不应该直接写在resolve
或reject
的后面。所以,最好在它们前面加上return
语句,这样就不会有意外。
new Promise((resolve, reject) => { return resolve() //后面语句不会执行 console.log('dd') })
2.promise.prorotype.catch():是.then(null, rejection)
的别名,用于指定发生错误时的回调函数。
getJSON('/posts.json').then(function(posts) { // ... }).catch(function(error) { // 处理 getJSON 和 前一个回调函数运行时发生的错误 console.log('发生错误!', error); });
建议总是使用catch
方法,而不使用then
方法的第二个参数
// bad promise .then(function(data) { // success }, function(err) { // error }); // good promise .then(function(data) { //cb // success }) .catch(function(err) { // error });
如果没有使用catch
方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。一般总是建议,Promise 对象后面要跟catch
方法,这样可以处理 Promise 内部发生的错误。catch
方法返回的还是一个 Promise 对象,因此后面还可以接着调用then
方法。
3.promise.prototype.finally():用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});
4.promise.all():用于将多个 Promise 实例,包装成一个新的 Promise 实例。
promises
是包含 n 个 Promise 实例,只有这n 个实例的状态都变成fulfilled
,或者其中有一个变为rejected
,才会调用Promise.all
方法后面的回调函数。
5.promise.race()同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
6.promise.resolve()将现有对象转为 Promise 对象,Promise.resolve
方法就起到这个作用
7.promise.reject()也会返回一个新的 Promise 实例,该实例的状态为rejected
。
8.promise.try()
Promise.try(database.users.get({id: userId})) .then(...) .catch(...)
参考 https://segmentfault.com/a/1190000010399626 执行顺序有介绍
参考 http://web.jobbole.com/91406/ promise原理 实现