为了账号安全,请及时绑定邮箱和手机立即绑定

使用键异步循环遍历数组

使用键异步循环遍历数组

呼啦一阵风 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 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信