Async / Await не работает в моем примере - PullRequest
0 голосов
/ 14 мая 2018

Многие JavaScript разработчики знают о async/await и их преимуществах, поэтому я пытаюсь протестировать старый пример асинхронного действия, давайте посмотрим на мой эксперимент:

Несомненно ответ ниже кода:

/*Line: 1*/ console.log(`1`);
/*Line: 2*/ console.log(`2`);
/*Line: 3*/ console.log(`3`);

//==>  123

Итак, я хочу поставить setTimeout для второй строки:

/*Line: 1*/ console.log(`1`);
/*Line: 2*/ setTimeout(() => {
               console.log(`2`);
            }, 0);
/*Line: 3*/ console.log(`3`);

//==> 132

Из-за асинхронного действия второй строки 2 идет после 13, поэтому в консоли отображается 132.

Я решил использовать функцию async/await нового JavaScript, чтобы снова увидеть 123, поэтому я написал приведенный выше код так:

(async () => {
    console.log(`1`);
    await setTimeout(() => {
        console.log(`2`);
    }, 0);
    console.log(`3`);
})();

Но это не работает, и я снова увидел 132 в своей консоли. Какую часть я сделал неправильно или я не знаю об этом?

Ответы [ 5 ]

0 голосов
/ 14 мая 2018

Ожидание должно вызываться для функции, которая возвращает обещание (в противном случае оно просто возвращает).

setTimeout не возвращает обещание, поэтому вам следует обернуть его функцией, которая возвращает обещание.

Подробнее об этом здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

Этот код должен работать.

(async() => {
  console.log(`1`);
  await (() => {
    return new Promise( resolve => {
      setTimeout(() => {
        console.log(2);
        resolve()
      }, 1000);
    });
  })();
  console.log(`3`);
})();
0 голосов
/ 14 мая 2018

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

async function someFunc() {
  console.log(`1`);
  await new Promise((resolve, reject) => setTimeout(() => {
      console.log(`2`);
      resolve();
  }, 0));
  console.log(`3`);
}

someFunc();
0 голосов
/ 14 мая 2018

Вам необходимо создать функцию, например async function foo() {}, и сделать внутри нее await вызовы.

0 голосов
/ 14 мая 2018

await ожидает выполнения обещания.Поскольку setTimeout не является обещанием, выполнение программы не будет ждать ее выполнения.Вам нужно будет заключить setTimeout() в обещание, как указано в первом примере следующей ссылки, чтобы ваш пример работал должным образом:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

0 голосов
/ 14 мая 2018

setTimeout не возвращает обещание. Чтобы заставить его работать, вам нужно будет создать функцию, возвращающую обещание, которое разрешается внутри обратного вызова setTimeout.

(async () => {
    console.log(`1`);
    await new Promise(resolve => {
	    setTimeout(() => {
		    resolve('resolved');
		    console.log(`2`);
	    },0);
    });
    console.log(`3`);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...