簡體   English   中英

等到所有請求調用都返回后再繼續

[英]Wait until all request calls are returned before continuing

我有一個運行的程序:

async function run() {

  for (i of object) {
   request("https://www." + i + ".mydomain.com")
   await wait(250) // synchronous, to prevent API spam
  }

  // HERE
  moveOn()
}

在運行 moveOn() 之前,如何等到我得到所有請求的響應?

使用 http 請求庫,該庫與諸如got()之類的承諾一起使用:

const got = require('got');

async function run() {

  let promises = [];
  for (let i of object) {
    promises.push(got("https://www." + i + ".mydomain.com"));
    await wait(250) // slight delay, to prevent API spam
  }
  let results = await Promise.all(promises);

  // HERE
  moveOn()
}

這里還有其他一些相關點。

  1. request()庫已被棄用,不推薦用於新代碼。
  2. 這里有一個推薦的替代庫列表,它們都是基於Promise的。
  3. 該列表中我個人最喜歡的是got() ,它支持request()庫所做的大多數選項,但更容易使用基於 Promise 的 API (在我看來)並且很好地支持前進。
  4. 請求之間的硬編碼 250 毫秒等待有點蠻力。 最好了解目標主機的實際限制和代碼對這些實際限制的實際限制,這些實際限制可能類似於最多 n 個請求/秒或同時在飛行中不超過 n 個請求或類似的東西,並且有一些軟件包可以幫助您實現代碼來解決這些限制。
  5. 如果其中一個請求出現錯誤,您還需要有意識地決定計划是什么。 此處顯示的結構將中止run() function 是任何一個請求都有錯誤。 如果你想做一些不同的事情,你需要使用try/catchawait got()捕獲錯誤,然后在catch塊中處理錯誤。

您可以使用axios()got()等。請嘗試這樣:

async function run() {
  let count = 0;

  for (i of object) {
   axios("https://www." + i + ".mydomain.com")
    .then(res => {
     count++;
     // Your code    
    })
    .catch(err => {
     count++;
    });

   await wait(250) // synchronous, to prevent API spam
  }

  // HERE
  setInterval(() => {
   if (count === object.length) {
    count = 0;
    moveOn()
   }
  }, 250);
}

暫無
暫無

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

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