【问题标题】:Access current iteration (index) during for await of loop javascript在等待循环javascript期间访问当前迭代(索引)
【发布时间】:2020-08-01 23:58:03
【问题描述】:

有一个关于for await ... of循环的问题。

我有以下代码:

    for await (let V of reagent_items.map(object_element => getPricing(object_element))) {
       console.log(object_element) //I'd like to have access to current iteration.
       //or
       console.log(reagent_items[i]) //current fulfilled element from reagent.map
    }

所以问题是这个函数数组(来自.map)(V 作为getPricing 的单个响应)不返回object_element 本身,但我需要访问这个object element 内部for await ... of 循环。

有没有可能?如果没有,使用Promise.all 会以某种方式解决这个问题吗?或者我应该修改原来的getPricingreturn 当前的object_element 其他结果?

【问题讨论】:

  • 我建议您将问题拆分为实际包含的两个问题。
  • getPricing 究竟返回了什么?承诺?
  • 一个像 {item_id: Number, price: Number, ... } 这样的对象,但是来自这个对象的这个数据是通过async/await 函数接收的,getPricing 不返回 object_element 本身.所以问题是关于:«我可以从函数的Array 访问 current_executed 元素/索引吗?

标签: javascript node.js for-loop async-await


【解决方案1】:

根据我从您的问题和 cmets 中了解到的情况,您希望能够在 for 循环中访问 object_elementgetPricing(object_element) 的结果。

您现在的问题是,作为map 的结果,您只有getPricing 的结果,而不是原来的object_element。作为一种解决方案,只需在一个对象中从 map 返回两者:

// just a random getPricing function
function getPricing(objectElement) {
    return {
        item_id: objectElement.id,
        price: Math.random()
    };
}

const reagent_items = [
    {
        id: 'a'
    },
    {
        id: 'b'
    }
];

for (let V of reagent_items.map(object_element => ({object_element, pricing: getPricing(object_element)}))) {
    console.log(`object_element: ${JSON.stringify(V.object_element)}, pricing: ${JSON.stringify(V.pricing)}`);
}

【讨论】:

  • 似乎我应该将.map 方法与Promise.all 结合起来,就像上面提到的@Bergi,但我也感谢你注意到问题格式并提供答案。
【解决方案2】:

should not be using for await here 根本就不是——这意味着异步生成器。相反,做

for (const object_element of reagent_items) {
    const V = await getPricing(object_element);
    console.log(object_element, V)
    …
}

使用Promise.all,代码将如下所示:

Promise.all(reagent_items.map(object_element =>
    getPricing(object_element).then(V => {
        console.log(object_element, V);
        …
    })
)).then(…)

// or:

await Promise.all(reagent_items.map(async object_element => {
    const V = await getPricing(object_element)
    console.log(object_element, V);
    …
}));

【讨论】:

  • 如果我无法选择逐个请求getPricing,我该怎么办,因为reagent_items 可能包含30+ 个试剂,这将导致执行30 秒而不是30 秒并行请求,1s内执行?
  • @AlexZeDim 用于并发请求,使用 Promise.all
  • 嗯,没错,Promise.all 将是完美的解决方案,因为我可以链接结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2014-05-21
相关资源
最近更新 更多