Выполнение Promise.all с параметрами - PullRequest
2 голосов
/ 02 октября 2019

Я пытаюсь создать Массив Обещаний, который я хотел бы выполнить, но не знаю, как лучше всего пройти через них.

Я думал, что следующий код делает свое дело, но появляется, когда я создаю массив обещаний, я фактически называю их побочным эффектом, что я не хочу делать до тех пор, пока не будет запущен Promise.all. .

import wait from 'waait'

const main = async () => {
    console.log('Start')
    const doStuff = async (name) => {
        console.log('Do stuff called', name)
        await wait(500)
        return name + ' is cool'
    }


    const names = ['Dan', 'Mitchell', 'Josh']

    const promises = names.map(name => doStuff(name))

    // const data = await Promise.all(promises)
    // console.log(data)
    console.log('End')
}

main()

Я обнаружил, что после закомментирования последних двух строк функция doStuff вызывается, когда console.log происходит в моей консоли.

Я ожидал, что поведение обещаний, созданных на карте, останется в черновом состоянии и затем будет вызвано в Promise.all, но это не так.

Может ли кто-нибудь объяснить и предложить объяснение того, как это должно быть сделано?

Ответы [ 2 ]

4 голосов
/ 02 октября 2019

Обещание начинается сразу после его создания. Не существует метода "start ()", поэтому все, что вам нужно сделать, это убедиться, что вы создаете обещания только тогда, когда они вам нужны. Я бы обернул вызов для создания ваших обещаний в функцию async, которая вызывается только тогда, когда должны быть созданы обещания, а затем await на Promise.all() внутри этой функции, как вы и предполагали.

Вы можете также рассмотреть возможность упаковки обещаний в асинхронных функциях и создания вместо них массива асинхронных функций - за исключением того, что вам все равно придется циклически перемещаться по массиву и вызывать каждую функцию, чтобы получить созданные обещания и ожидать их. Возможно, что-то вроде:

var pending = names.map(n => async ()=>await doStuff(n));  // (warning: untested; off the top of my head)

Тогда у вас есть массив ожидающих обещаний, обернутых в функции. Когда придет время, вы можете использовать var promises = pending.map(f=>f()) для вызова функций и создания массива обещаний.

0 голосов
/ 02 октября 2019

Вы можете создавать обещания внутри Promise.all():

const names = ['Dan', 'Mitchell', 'Josh']

const data = await Promise.all(names.map(name => doStuff(name)));
console.log(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...