原文地址Promise.race//`delay`毫秒后执行resolve函数timerPromisefy(delay){returnnewPromise(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是当accepted参数数组中的promise对象进入fulfilled或rejected状态时停止运行。此时,由于只能确定一个promise,则执行唯一确定状态的resolve函数,不执行其他resolve,但不妨碍其他promise的执行。关于promise.race的使用,我们知道promise.race只要参数promise数组中有promise状态变化就会执行后续的回调,那么如果参数数组中第一个返回的是失败状态,就会去直接拒绝。这违背了我们使用的目的。但是参数中promise状态的变化是由开发者控制的。如果不希望这种情况发生,可以在定义promise时设置错误处理,保证promise.race需要解析definitestate。在实际应用中,经常使用promise.race来设置超时操作,比如接口请求超时。并且注意不要将空数组传递给promise.race,那么promise将不会被resolve。为什么每次使用then都需要创建一个新的promise?如果你不创建一个新的承诺,你每次都会返回以前的承诺。那么当一开始promise的状态发生变化的时候,后面的promise的状态其实是固定的,不会再发生变化。.这样就无法实现promise的功能,所以各个promise对象应该是相互独立的,互不影响。看似矛盾的问题letpromise1=Promise.resolve()letpromise2=promise1.then(functionfoo(value){returnPromise.reject(3)})执行结果:看似矛盾,promise1明明执行成功了回调,为什么最后的promise2状态被拒绝。原因是调用then的时候,创建了一个新的promise,此时和promise1没有任何关系,返回的时候改变了新创建的promise的状态,变成了rejected。不过看了Promises/A+的标准,这里的描述似乎还有一些需要研究确认的地方。标准说,如果onFulfilled或onRejected返回一个promise对象(thenable对象),那么promise2将接受x的状态。上述代码的执行结果似乎与标准中的描述不一致,这个问题需要进一步考虑。[思考]这其实并不矛盾。promise2接受的是返回的promise的状态,与原来的promise无关。这里真的很容易混淆。关于promise.then(functionfunc(value){console.log('1-'+value)returnvalue*2}).then(functionfunc(value){console.then(functionfunc(value){console.log('2-'+value);}).then(functionfunc(value){console.log('3-'+value)})可以看到执行结果,如果没有使用没有return,那么previousthen执行结果不会传递给下一个then。[思考]如果对某些问题感到迷茫或不清楚,一定要思考写一个demo跑起来。您不能依靠直觉或固定思维来思考结果。毕竟,实践是检验真理的唯一标准。
