Promise 英文译为:许诺,允诺,希望。
理解了 Promise 这个词的意思,对学习 Promise 语法很有帮助。
Promise 是异步编程的一种解决方案,ES6 将它写进了语言标准,统一了用法。
Promise 的特点
对象的状态是不受外界影响的。Promise 是无法取消的,一旦建立就会执行。它有三种状态:pending(进行中),fulfilled(已成功),rejected(已失败)。
Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和 从 pending 变为 rejected 。只有结果才会决定当前属于哪一状态,任何操作都无法改变状态。只要状态发生,就不会再变了。
Promise 的基本用法
let onePromise = new Promise(function(resolve,reject){
//resolve(...) 用来完成这个 Promise
//reject(...) 用来拒绝这个 Promise
})
?Promise 链式调用(示例很简单)
function delay(time){
return new Promise(function(resolve,reject){
setTimeout(resolve,time)
})
}
delay(100).then(function goNext1Fn(){
console.log(\\\"go1...\\\")
return delay(200);
}).then(function goNext2Fn(){
console.log(\\\"go2...\\\");
})
?调用 delay(100),创建一个将在 100ms 后完成的 Promise,然后继续扩展下一个 then 的回调。
第 1 个 then 就是链式调用的第一步,第 2 个 then 就是链式调用的第 2 步,可以一直任意的扩展下去。如果前一个 then 引入了一个回调,那下一个 then 会等待执行完成后,继续调用。
Promise 并行
如果我们想同时执行两个或者是执行三个并行执行,要怎样实现呢?Promise 提供了 Promise.all() 方法,可以协调多个并发。
const p = Promise.all([p1, p2, p3]);
p的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise 竞态
如果项目同时请求三个接口,而只以第一个接口返回的数据为你使用,抛弃其他数据。这种情况 Promise 也考虑到了,提供了 Promise.race() 方法,在传统模式上叫门闩,在 promise 中称为竞态。
使用注意事项
Promise 必须和 new 一起使用,并且必须提供一个函数回调,这个回调是同步或者是立即调用的函数,接受两个函数回调用于 promise 的决议(resolve),通常我们把这两个函数称为 resolve 和 reject 。
Promise 传空数组
如果 Promise.all 传入一个空数组,它会立即完成,如果 Promise.race 传入一个空数组会一直挂着,永远都不会往下执行。
参考资料:
《你不知道的 Javascript 中 》
http://es6.ruanyifeng.com/#docs/promise
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34484.html