在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ Promise.race數(shù)組中當(dāng)有一個(gè)promise返回時(shí),其它的promise

Promise.race數(shù)組中當(dāng)有一個(gè)promise返回時(shí),其它的promise就不再被then處理了?

看這個(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)

回答
編輯回答
念初

clipboard.png

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.allPromise.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);
// });
2017年1月17日 11:32
編輯回答
孤酒

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 };
2017年3月3日 14:50
編輯回答
涼汐

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è)來

2018年7月31日 06:44