亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用鍵異步循環遍歷數組

使用鍵異步循環遍歷數組

呼啦一陣風 2021-12-12 09:59:29
我有一組客戶,我想遍歷他們并為每個客戶分配一個屬性。通過 details 函數返回具有添加屬性的客戶對象for (let i = 0; i < customers.length; i++){    customers[i] = await details(customers[i]);}這就是我目前這樣做的方式,但它是同步的。我希望列表中的所有對象都異步完成。我正在嘗試使用異步庫,但它只為我提供循環內可用的客戶對象,因此客戶數組永遠不會改變。async.forEachOf(customers, (customer, finished) async =>{    customer = await details(customer);    finished();});否則我該怎么做?謝謝
查看完整描述

3 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

您不需要第三方庫來完成此操作。只需使用Promise.all()和Array.prototype.map()。


const customerDetails = await Promise.all(

  customers.map(customer => details(customer))

);


查看完整回答
反對 回復 2021-12-12
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

阿庫不需要異步迭代項的陣列。


例如,要異步處理此數組:


const arr = [1, 2, 3];


首先,從數組創建一個生成器,以便您可以為數組中的每個項目生成執行:


/**

 * A convenience function for creating a ES2015 Generator to iterate over

 * items in an array.

 *

 * @template T

 * @param {T[]} value

 */

function* toIterator<T>(value: T[]) {

  const generator = value[Symbol.iterator]();

  for (let generated of generator) {

    yield generated;

  }

}

然后,異步迭代數組的關鍵是resolve在提供的handler.



/**

 * Provides the ability to process an iterator's values asynchronously

 * with a predicate, `hander`.

 *

 * @template T

 * @template TReturn

 * @template TNext

 * @param {Generator<T, TReturn, TNext>} generator

 * @param {(arg: T) => Promise<TReturn>} handler

 * @returns

 */

async function iterateAsynchronously<T, TReturn, TNext>(

  generator: Generator<T, TReturn, TNext>,

  handler: (arg: T) => Promise<TReturn>

) {

  const iterate: () => Promise<TReturn> = async () => {

    const generated = generator.next();

    if (generated.done) {

      return generated.value;

    }

    return handler(generated.value).then(iterate);

  };

  return iterate();

}

如果您愿意,可以使用這些方法中的一種或兩種來擴展全局數組。另一個例子。


這將允許您在異步處理項目后將更多數組方法鏈接在一起:


const run = async () => {

  const arr = [1, 2, 3, 4];

  console.log((await arr.iterateAsynchronously((val) => new Promise(r => {

    setTimeout(r, 2000);

    console.log('Processing', val);

  }))).reverse());

}

run();

在這種情況下,由于使用返回數組本身的函數擴展修改了數組原型,因此您可以像以前一樣將數組方法鏈接在一起。


查看完整回答
反對 回復 2021-12-12
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

此代碼將details()一個接一個地為每個客戶運行,而無需等待前一個。您創建了一系列承諾并在最后等待它們


const promises = [];

for (let i = 0; i < customers.length; i++) {

    let p = new Promise(async (resolve, reject) => {

      customers[i] = await details(customers[i]);

      resolve();

    });

    promises.push(p);

}

await Promise.all(promises);


查看完整回答
反對 回復 2021-12-12
  • 3 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號