看這個(gè)網(wǎng)頁:https://www.kancloud.cn/kancl...
說是Promise.race 在第一個(gè)promise對(duì)象變?yōu)镕ulfilled之后,并不會(huì)取消其他promise對(duì)象的執(zhí)行。
但是在下面的代碼中,需要在web上顯示所有的platform當(dāng)前狀態(tài)是在線還是離線,對(duì)platformList中的每個(gè)platform構(gòu)建一個(gè)promise,在promise里面進(jìn)行一次ajax api調(diào)用,實(shí)際調(diào)試環(huán)境中,數(shù)組有兩個(gè)元素,一個(gè)會(huì)api成功(resolve ok),另一個(gè)會(huì)失敗(resolve not ok),,運(yùn)行時(shí)發(fā)現(xiàn)then只運(yùn)行了一次,只打印了一次Promise.race race get result就沒有反應(yīng)了,第二次ajax打印了“resolve not ok”之后,沒有再調(diào)用then中的回調(diào)函數(shù):
var i
var promiseArray = []
const self = this
for (i in self.platformList) {
var p = new Promise(function(resolve, reject) {
apiGetPlatformIsOnline(self.platformList[i].id)
.then(response => {
console.log("resolve ok")
resolve(response.data)
})
.catch((err) => {
console.log("resolve not ok")
resolve(response.data)
})
});
promiseArray.push(p)
}
Promise.race(promiseArray).then(function(results) {
console.log("Promise.race race get result:", results)
}).catch(function(results) {
console.log("catch error,results", results);
});
據(jù)說用ajax同步或ajax遞歸能解決問題,就想問問,這種場(chǎng)合到底還能不能用promise了?一些指標(biāo)監(jiān)控類的頁面經(jīng)常遇到這種情況,初始化時(shí)并發(fā)地撒出一大把異步的api查詢請(qǐng)求,然后回復(fù)一個(gè)就處理一個(gè),成功了顯示查詢結(jié)果,失敗了就顯示一個(gè)問號(hào)
Promise.race在第一個(gè)promise對(duì)象變?yōu)?code>Fulfilled之后,并不會(huì)取消其他promise對(duì)象的執(zhí)行。只是只有先完成的Promise才會(huì)被Promise.race后面的then處理。其它的Promise還是在執(zhí)行的,只不過是不會(huì)進(jìn)入到promise.race后面的then內(nèi)。
Promise.all和Promise.race都是有使用場(chǎng)景的。
有些時(shí)候我們做一個(gè)操作可能得同時(shí)需要不同的接口返回的數(shù)據(jù),這時(shí)我們就可以使用Promise.all;
有時(shí)我們比如說有好幾個(gè)服務(wù)器的好幾個(gè)接口都提供同樣的服務(wù),我們不知道哪個(gè)接口更快,就可以使用Promise.race,哪個(gè)接口的數(shù)據(jù)先回來我們就用哪個(gè)接口的數(shù)據(jù)。
看你這個(gè)需求,這幾個(gè)請(qǐng)求完全沒有關(guān)系,所以就創(chuàng)建n個(gè)promise,然后在各自的回調(diào)里面做各自的事情不行嗎?
Update2:
感覺好像沒有必要用promise。
Update3:
在for循環(huán)里面使用let來聲明i,就可以在then和catch里面使用i來分辨是哪個(gè)請(qǐng)求了。
// var i
// var promiseArray = []
const self = this
for (let i in self.platformList) {
// var p = new Promise(function(resolve, reject) { // 這個(gè)位置的promise感覺也沒有必要了
apiGetPlatformIsOnline(self.platformList[i].id)
.then(response => {
console.log("resolve ok") // 在這里處理每個(gè)請(qǐng)求成功的操作
// resolve(response.data)
})
.catch((err) => {
console.log("resolve not ok") // 在這里處理每個(gè)請(qǐng)求失敗的操作
// resolve(response.data)
})
// });
// promiseArray.push(p)
}
// 下面的這部分感覺沒有必要
// Promise.race(promiseArray).then(function(results) {
// console.log("Promise.race race get result:", results)
// }).catch(function(results) {
// console.log("catch error,results", results);
// });race的意思是競(jìng)爭(zhēng),只要有一個(gè)promise返回整個(gè)race就會(huì)返回。
如果想限制需要有promise被resolve再返回,可以檢查race的返回的promise數(shù)組,剔除掉被reject的promise,然后繼續(xù)race。
實(shí)現(xiàn)起來并不復(fù)雜,難想的是如何得知哪個(gè)promise被reject了,js本身沒有檢查promise狀態(tài)的API,所以你必須把所有promise挨個(gè)catch一把。
import { $log } from 'ts-log-debug';
function properRace<T>(promises: Array<Promise<T>>): Promise<T> {
if (promises.length < 1) {
return Promise.reject('Can\'t start a race without promises!');
}
// There is no way to know which promise is rejected.
// So we map it to a new promise to return the index when it fails
const indexPromises = promises.map((p, index) => p.catch(e => {
$log.debug('Promise rejected in `properRace`: ' + e);
throw index;
}));
return Promise.race(indexPromises).catch(index => {
// The promise has rejected, remove it from the list of promises and just continue the race.
promises.splice(index, 1)[0].catch(() => { /* eat this */ });
return promises.length ? properRace(promises) : Promise.reject('All promises rejected');
});
}
export { properRace };var successList = [];
var errorList = [];
request.map(getRequset).reduce((sequence, requestPromise) => sequence.then(() => requestPromise).then(message => { successList.push(message)}).catch(err => {errorList.push(err)})), Promise.resolve());
這個(gè)可以同時(shí)并發(fā)發(fā)送請(qǐng)求,但是處理還是需要一個(gè)一個(gè)來
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。