Получить предыдущий элемент в асинхронной функции - PullRequest
0 голосов
/ 13 декабря 2018

У меня три записи.Чтобы обновить каждую запись, мне нужно взять значение предыдущей записи.Проблема заключается в том, что когда метод является асинхронной, запись три начинает обновляться до окончания записи два и получает значение null.Как я могу справиться с этим?

const resolvePersons = async (persons) => {
      return Promise.all(persons.map(async (person) => {
        const data = await getSomePersonData(person);
        const value = await getValue(persons); // first person value is statically set
        return { data, value };
      }));
};

function getSomePersonData(person) {
    return new Promise((resolve, reject) => setTimeout(() => resolve({data: someData}), 100);
}

function getValue(persons) {
    return new Promise((resolve, reject) => setTimeout(() => resolve(persons[index - 1].value), 100);
}

1 Ответ

0 голосов
/ 13 декабря 2018

Не используйте Promise.all и map, если вы не хотите, чтобы итерации выполнялись одновременно.Просто напишите нормальный цикл, который await s что-то:

async function resolvePersons(persons) {
    const result = [];
    for (const [i, person] of persons.entries()) {
        const data = await getSomePersonData(person);
        const prevValue = i == 0 ? null : result[i-1].value;
        const value = await getValue(prevValue);
        result.push({ data, value });
    }
    return result;
}
...