簡體   English   中英

NodeJS:鏈在 promise 中自動運行?

[英]NodeJS: Chain functions automatically in a promise?

我目前正在從 API 獲取數據,我需要執行多個 GET 請求(使用 axios)。 在所有這些 GET 請求完成后,我返回一個已解析的 promise。

但是,我需要根據數組列表自動執行這些 GET 請求:

    function do_api_get_requests() {

        return promise = new Promise(function(resolve, reject) {

          API_IDs = [0, 1, 2];

          axios.get('https://my.api.com/' + API_IDs[0])
          .then(data => {
            // Do something with data

            axios.get('https://my.api.com/' + API_IDs[1])
            .then(data => {
              // Do something with data

              axios.get('https://my.api.com/' + API_IDs[2])
              .then(data => {
                // Do something with data
                
                // Finished, resolve
                resolve("success");
                
              }


            }


          }

        }

    }

這行得通,但問題是 API_IDs 並不總是同一個數組,它會改變。 所以我不確定如何自動鏈接這些請求。

既然你說它可能是一個可變長度數組並且你顯示了請求的順序,你可以使用 async/await 循環遍歷數組:

async function do_api_get_requests(API_IDS) {
    for (let id of API_IDS) {
        const data = await axios.get(`https://my.api.com/${id}`);
        // do something with data here
    }
    return "success";
}

而且,既然你說 API ids 的列表是可變的,我把它作為一個參數,你可以傳遞給 function。


如果您想並行運行所有 API 請求(這對於小型陣列可能沒問題,但對於大型陣列可能會很麻煩)並且您不需要按特定順序運行它們,您可以這樣做:

function do_api_get_requests(API_IDS) {
    return Promise.all(API_IDS.map(async (id) => {
        const data = await axios.get(`https://my.api.com/${id}`);
        // do something with data here for this request
    })).then(() => {
        // make resolved value be "success"
        return "success";
    });
}

根據您的情況,您也可以使用Promise.allSettled() 由於您沒有顯示返回結果,因此不清楚這是否有用。

您可以使用Promise.all()方法同時執行所有 API 請求,並在所有請求都解析時解析。

function do_api_get_requests() {
  const API_IDs = [0, 1, 2];

  let promises = [];
  for (const id of API_IDS) {
    promises.push(axios.get(`https://my.api.com/${id}`));
  }

  return Promise.all(promises);
}

如果您使用 Bluebird.js(更好的 promise 庫,並且比內置的Promise ),您可以使用Promise.each()Promise.mapSeries()Promisme.reduce()來做你想做的。

http://bluebirdjs.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM