原文地址javascript
// `delay`毫秒后执行resolve function timerPromisefy(delay) { return new Promise(function (resolve) { setTimeout(function () { resolve(delay); }, delay); }); } // 任何一个promise变为resolve或reject 的话程序就中止运行 Promise.race([ timerPromisefy(1), timerPromisefy(32), timerPromisefy(64), timerPromisefy(128) ]).then(function (value) { console.log(value); // => 1 });
Promise.race 是当接受的参数数组中有一个promise对象进入fulfilled或者rejected状态的时候就中止运行。此时,因为只有一个promise的状态可以肯定,因此then执行的是惟一那个肯定状态的resolve函数,而不会执行其余的resolve,可是并不会阻止其余promise的执行。java
咱们知道promise.race若是参数promise数组中只要有一个promise状态改变就会执行后续的回调,那么若是参数数组中最早返回的是失败状态,那就直接走到了rejected,其实这违背了咱们使用的初衷。不过参数中promise状态的改变是由开发者控制的,若是不想发生这样的状况,能够在promise定义的时候设置好错误处理,保证promise.race须要解析的必定是肯定的状态。git
在实际应用中,promise.race经常使用来设置超时操做,好比接口请求超时等。并且要注意不要给promise.race传入空数组,那么这个promise将不会被解析。github
若是没有建立新的promise,每次都是返回以前的promise,那么当最开始promise的状态发生改变以后,后续的promise状态其实已经固定不会再改变了。这就没法实现promise的功能,因此每次的promise对象都应该相互独立,互相不影响。数组
let promise1 = Promise.resolve() let promise2 = promise1.then(function foo(value) { return Promise.reject(3) })
执行结果:promise
看似矛盾,promise1明明执行了成功的回调,为何最后promise2的状态是rejected。缘由是在调用then的时候,建立了新的promise,此时与promise1已经没有关系了,返回的时候改变的是新建立的promise的状态,变为rejected。函数
不过看了下Promises/A+的标准,这边叙述貌似还有些须要再研究确认一下的地方。spa
标准中说,若是onFulfilled或者onRejected返回一个promise对象(thenable对象),那么promise2会接受x的状态。上述代码彷佛执行结果与标准中的叙述有矛盾,这个问题还须要再思考下。code
这个其实并非矛盾,promise2接受的是返回的promise的状态,与原来的没有关系。这边确实很容易混淆。对象
promise1.then(function func(value){ console.log('1-'+value) return value * 2 }).then(function func(value){ console.log('2-'+value); }).then(function func(value){ console.log('3-'+value) })
执行结果
能够看到,若是不使用没有return,那么上一个then的执行结果并不会传递到下一个then当中。
有些问题若是以为有疑惑或者弄不太清,那就必定要想着写个demo运行看下,不能靠直觉或者思惟定势去想结果,毕竟~实践是检验真理的惟一标准~