簡體   English   中英

如何將異步函數推送到數組而不執行未來的 Promise.all

[英]How to push async functions to an array without execution for a future Promise.all

我有一些異步函數可以調用 REST API 並返回結果。 我想使用 Promise.all 一次調用其中幾個函數並等待完整結果。 我了解 Promise.all 的工作原理,這不是 Promise.all 的問題。 這是使用 Array.push 動態創建我想要調用的異步函數數組的問題。

所以這是場景。 我的應用程序的用戶加載了一個頁面。 該頁面需要從 API 檢索數據。 它使用我提到的那些異步函數來做到這一點。 但是,頁面需要檢索的數據根據​​設置的參數而有所不同。 所以有時,它可能需要檢索用戶列表、特定客戶和特定項目。 其他時候,它可能需要獲得所有用戶和所有項目,而沒有客戶。

所以我的代碼看起來像這樣:

created() {
  let promiseList = []
  if (options.getCustomers) { promiseList.push(listCustomers())
  if (options.getCustomer) { promiseList.push(getCustomer(customerId)) }
  if (options.getUsers) { promiseList.push(getUsers()) }
  await Promise.all(promiseList)
}

所以這在某種程度上是有效的。 Promise.all 工作正常。 問題是我不能在沒有立即調用函數的情況下將函數推送到數組。 因此,我推送到 promiseList 數組的每個函數都會被調用兩次:使用 Promise.all 一次又一次地調用。

如何將異步函數作為引用推送到數組,以便它不會立即執行?

將對該函數的引用放入數組中,然后在使用 Promise.all 時使用映射調用

created() {
  let promiseList = []
  if (options.getCustomers) { promiseList.push({ func: listCustomers })
  if (options.getCustomer) { promiseList.push({ func: getCustomer, arg: customerId}) }
  if (options.getUsers) { promiseList.push({ func: getUsers }) }
  await Promise.all(promiseList.map( (prom) => prom.func(prom.arg) ))
}

也可以推送功能

created() {
     let promiseTasks = []; // meaning name is better
     if (options.getCustomers) {
         promiseTasks.push(() => listCustomers());
     }
     if (options.getCustomer) {
         promiseTasks.push(() => getCustomer(customerId));
     }
     if (options.getUsers) {
         promiseTasks.push(() => getUsers());
     }

     await Promise.all(promiseTasks.map((func) => func()));
 }

注意:我不認為是你要使用Promise.all的用例,因為它看起來像所有的get請求,最好分開到不同的端點。

請求選項通常可以是以下選項:限制、排序、投影、populateQuery、preventPopulate。

暫無
暫無

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

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