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