js для блокируется или нет при ожидании? - PullRequest
0 голосов
/ 12 июля 2020
const somefunction = async () => {
  const arr = [...]
  for(let i = 0 ; i < arr.length ; ++i){
    await updater(arr[i])
  }
}

Вышеупомянутое для l oop будет ждать разрешения обещания перед переходом к следующей итерации, но является ли это теперь блокирующим действием для основного события l oop in nodejs?

обратите внимание: это «for», а не «forEach» l oop. Очень разные.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Как вы можете видеть, запустив этот пример, функция будет неблокирующей. Такова природа asyn c await.

    function asyncAction(message) {
        console.log("asyncAction start: " + message)
        return new Promise ( (res, err) => {
                                            setTimeout( () => res("done"),2000)
                                            }
        )
        console.log("asyncAction complete: " + message)
    }   

    async function asyncActions() {
        await asyncAction("1")
        console.log("1 done")
        await asyncAction("2")
        console.log("2 done")
        await asyncAction("3")              
        console.log("3 done")
    }   

    console.log("program start")
    asyncActions()
    console.log("program complete")
1 голос
/ 12 июля 2020

Нет, это не блокирует.

async функции go для перехода в спящий режим, пока они await выполняют обещание. Управление возвращается вызывающей функции (которая получает неразрешенное обещание, возвращаемое функцией async).

(Конечно, если updater блокируется, он все равно будет блокироваться).

...