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