Получите доступ к текущей итерации (индексу) в течение ожидания l oop javascript - PullRequest
0 голосов
/ 19 апреля 2020

Есть вопрос по поводу for await ... of l oop.

У меня есть следующий код:

    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 l oop.

Возможно ли это как-то или нет? А если нет, то использование Promise.all как-то решает эту проблему? Или я должен изменить исходные getPricing и return текущий object_element с другими результатами?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Вам вообще не следует использовать for await - это предназначено для асинхронных генераторов. Вместо этого выполните

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);
    …
}));
1 голос
/ 19 апреля 2020

Из того, что я могу понять из вашего вопроса и ваших комментариев, вы хотите получить доступ к object_element и результату getPricing(object_element) в пределах for l oop.

проблема в том, что в результате 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)}`);
}
...