promise学习(3)

原文地址javascript

Promise.race

// `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.race若是参数promise数组中只要有一个promise状态改变就会执行后续的回调,那么若是参数数组中最早返回的是失败状态,那就直接走到了rejected,其实这违背了咱们使用的初衷。不过参数中promise状态的改变是由开发者控制的,若是不想发生这样的状况,能够在promise定义的时候设置好错误处理,保证promise.race须要解析的必定是肯定的状态。git

在实际应用中,promise.race经常使用来设置超时操做,好比接口请求超时等。并且要注意不要给promise.race传入空数组,那么这个promise将不会被解析。github

为何使用then每次须要建立一个新的promise

若是没有建立新的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的状态,与原来的没有关系。这边确实很容易混淆。对象

关于promise.then链式调用时参数value的传递
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运行看下,不能靠直觉或者思惟定势去想结果,毕竟~实践是检验真理的惟一标准~

相关文章
相关标签/搜索