Почему Async не работает в моем случае (Node js)? - PullRequest
0 голосов
/ 07 июля 2019

Я новичок в async / await для Node.Мне трудно понять, как работает async / await.Был бы признателен, если бы кто-то мог указать мне направление обучения.

async function loop() {
  let i = 0;
  while (i < 10000) {
    i++;
  }
  console.log('step 2');
}

console.log('step 1');
loop();
console.log('step 3');

ожидание: «шаг 1», «шаг 3», «шаг 2» в последовательности, но это печатает «шаг 1», «шаг»2 ',' шаг 3 ', как будто это синхронно.

Ответы [ 3 ]

3 голосов
/ 07 июля 2019

асинхронные функции выполняются немедленно и только «пауза», когда вы попадаете на первый оператор await.

Нет особого смысла использовать асинхронную функцию для этой цели. Если ваша цель - просто выполнить что-то чуть позже, вы, вероятно, захотите process.nextTick.

0 голосов
/ 07 июля 2019

Если вы хотите, чтобы loop зациклился асинхронно, сделайте что-то асинхронное в цикле.async функция выполняется синхронно вплоть до первого await (или когда она возвращается), после чего она возвращает обещание о ее завершении.

Асинхронные циклы иногда хорошо моделируютсякак функции асинхронного генератора:

function somethingAsync(value) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(value);
        }, Math.random() * 50);
    });
}
async function* loop() {
    let i = 0;
    while (i < 10) { // made it 10 instead of 10000
        yield somethingAsync(i++);
    }
    console.log('step 2');
}
console.log('step 1');
const gen = loop();
console.log('step 3');
(async () => {
    for await (const value of gen) {
       console.log(value);
    }
})();

Там генератор выдает обещание следующего значения (очевидно, somethingAsync является заполнителем для чего-то, что на самом деле что-то делает, а не просто возвращает значение после задержки).Использование for-await-of позволяет циклически выполнять значения выполнения обещаний, которые возвращает генератор.

0 голосов
/ 07 июля 2019

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

function timeout(){
    return new Promise((resolve,reject) => {
        setTimeout(() => {
           resolve('step 2')
        }, 1000)  
    })
}

async function loop() {
    const result = await timeout()
    console.log(result)
}

console.log('step 1');
loop();
console.log('step 3');

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

В основном вы используете ключевое слово awaitждать разрешения Promise (асинхронной операции), а ключевое слово await можно использовать только в асинхронных функциях.

Надеюсь, этот ответ поможет, я попытался объяснить его максимально простым способом.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...