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運行看下,不能靠直覺或者思惟定勢去想結果,畢竟~實踐是檢驗真理的惟一標準~

相關文章
相關標籤/搜索