摘要:此時,由于只有一個的狀態能夠確定,所以執行的是唯一那個確定狀態的函數,而不會執行其他的,但是并不會阻止其他的執行。在實際應用中,常用來設置超時操作,比如接口請求超時等。思考這個其實并不是矛盾,接受的是返回的的狀態,與原來的沒有關系。
原文地址
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的執行。
關于promise.race的使用我們知道promise.race如果參數promise數組中只要有一個promise狀態改變就會執行后續的回調,那么如果參數數組中最先返回的是失敗狀態,那就直接走到了rejected,其實這違背了我們使用的初衷。不過參數中promise狀態的改變是由開發者控制的,如果不想發生這樣的情況,可以在promise定義的時候設置好錯誤處理,保證promise.race需要解析的一定是確定的狀態。
在實際應用中,promise.race常用來設置超時操作,比如接口請求超時等。而且要注意不要給promise.race傳入空數組,那么這個promise將不會被解析。
如果沒有創建新的promise,每次都是返回之前的promise,那么當最開始promise的狀態發生改變之后,后續的promise狀態其實已經固定不會再改變了。這就無法實現promise的功能,所以每次的promise對象都應該相互獨立,互相不影響。
看似矛盾的問題let promise1 = Promise.resolve() let promise2 = promise1.then(function foo(value) { return Promise.reject(3) })
執行結果:
看似矛盾,promise1明明執行了成功的回調,為什么最后promise2的狀態是rejected。原因是在調用then的時候,創建了新的promise,此時與promise1已經沒有關系了,返回的時候改變的是新創建的promise的狀態,變為rejected。
不過看了下Promises/A+的標準,這邊敘述貌似還有些需要再研究確認一下的地方。
標準中說,如果onFulfilled或者onRejected返回一個promise對象(thenable對象),那么promise2會接受x的狀態。上述代碼似乎執行結果與標準中的敘述有矛盾,這個問題還需要再思考下。
【思考】這個其實并不是矛盾,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運行看下,不能靠直覺或者思維定勢去想結果,畢竟~實踐是檢驗真理的唯一標準~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/96701.html
摘要:回調函數成功回調處理器失敗回調處理器用戶發送一個向百度服務器獲取數據的異步請求無阻塞高并發的的誕生更加嚴重的依賴異步操作才能完成無阻賽高并發的特性。 Promise Promise 是什么? 詞語本意: 發音:[?pr?m?s] 詞性:名詞, 翻譯:許諾,允諾。 MDN解釋 Promise 對象用于一個異步操作。 一個Promise表示一個現在,將來或永不可能可用的值。 按照書寫方...
摘要:所謂的能對狀態進行操作的特權方法,指的就是能對對象的狀態進行等調用的方法,而通常的的話只能在通過構造函數傳遞的方法之內對對象的狀態進行操作。一般會在構造函數中編寫邏輯,什么時候執行回調,什么時候執行回調。 原文地址 1. 在then中使用reject 如果一個promise最初只定義了resolve,但是還想要使用reject怎么辦? 可以在then中返回一個新的promise。這個...
摘要:版本以及之前,本身還沒有異步執行代碼的能力,宿主環境傳遞給引擎,然后按順序執行,由宿主發起任務。采納引擎術語,把宿主發起的任務稱為宏觀任務,把引擎發起的任務稱為微觀任務。基本用法示例的回調是一個異步的執行過程。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的...
摘要:版本以及之前,本身還沒有異步執行代碼的能力,宿主環境傳遞給引擎,然后按順序執行,由宿主發起任務。采納引擎術語,把宿主發起的任務稱為宏觀任務,把引擎發起的任務稱為微觀任務。基本用法示例的回調是一個異步的執行過程。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的...
摘要:版本以及之前,本身還沒有異步執行代碼的能力,宿主環境傳遞給引擎,然后按順序執行,由宿主發起任務。采納引擎術語,把宿主發起的任務稱為宏觀任務,把引擎發起的任務稱為微觀任務。基本用法示例的回調是一個異步的執行過程。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的...
閱讀 3178·2021-11-22 15:25
閱讀 3855·2021-11-17 09:33
閱讀 3370·2021-11-08 13:15
閱讀 3052·2021-09-22 10:56
閱讀 542·2021-08-31 09:45
閱讀 2755·2019-08-30 13:49
閱讀 3082·2019-08-30 12:52
閱讀 1146·2019-08-29 17:05