Есть ли разница между этим асинхронным / ожидающим кодом? - PullRequest
1 голос
/ 11 октября 2019

Я читал об асинхронном / ожидающем использовании и передовых практиках, и кто-то предложил в комментариях, что этот код:

const makeRequest = async () => {
    const value1 = await promise1()
    const value2 = await promise2()

    return promise3(value1, value2)
}

можно записать так:

const makeRequest = async () => {
    const value1 = promise1()
    const value2 = promise2()

    return promise3(await value1, await value2)
}

Этотот же самый? Если нет, то в чем разница?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Они разные. Самое большое отличие состоит в том, что в первом примере нужно дождаться завершения обещания 1, прежде чем даже пытаться выполнить обещание 2.

В первом примере поток выглядит следующим образом:

  1. ВызовОбещание1

  2. Ожидание завершения обещания1 и сохранение значения1

  3. Вызов обещания2

  4. ОжиданиеОбещание2 выполнить и сохранить в значении2

Во втором примере поток выглядит следующим образом:

  1. Вызовите обещание1

  2. Вызовите обещание2

  3. Дождитесь завершения обещания 1 и обещания 2

Во втором примере оба обещания могут быть оба: обещание 1 и обещание 2вызван таким образом, что обещание2 не должно ждать завершения обещания 1.

Еще один способ, которым это может выглядеть, - использование Promise.all

ex:

const makeRequest = async () => {
    const [value1, value2] = await Promise.all([promise1(), promise2()])
    return promise3(value1, value2)
}

Обещание. все откроют оба обещания и подождут, пока они все не выполнятся, прежде чем вернуться:Затем значения romise помещаются в массив в том порядке, в котором обещания были в массиве обещаний. Используя destruuring , мы можем получить эти значения обратно из встроенного массива значений.

1 голос
/ 11 октября 2019
const makeRequest = async () => {
    const value1 = await promise1()
    const value2 = await promise2() // waits for promise1() to complete before this statement is executed. wastes time if value2 does not depend on value1

    return promise3(value1, value2)
}
const makeRequest = async () => {
    const value1 = promise1() //calls promise, does not wait for it to resolve
    const value2 = promise2() //calls the next promise, does not wait for it to resolve,

    return promise3(await value1, await value2) // calls promise 3 after both values have resolved
}

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

...