асинхронное ожидание медленнее, чем обратный вызов - PullRequest
3 голосов
/ 05 июля 2019

Я пытаюсь преобразовать обратные вызовы в async / await, но обнаружил, что async / await намного медленнее, чем существующие обратные вызовы. Кто-нибудь может увидеть, что не так с моим async / await?

for (var i = 0; i < balance; i++) {      
  tokenOfOwnerByIndex().call(i).then((id) => {           
      tokenURI().call(id).then((uri) => {
          console.log(uri);
      });
  });         
}
for (var i = 0; i < balance; i++) {
  var id = await this.getTokenOfOwnerByIndex(i);
  var uri = await this.getTokenURI(id);
  console.log(uri);
}

1 Ответ

1 голос
/ 05 июля 2019

В первой версии tokenOfOwnerByIndex называется возвращением обещания. Вы присоединяете обратный вызов через then, и цикл продолжается. Обещание в конечном итоге разрешится, но ваш цикл for выполняется задолго до этого.

Когда вы используете await, вы блокируете следующий код, пока обещание не разрешится. Это означает, что каждый вызов tokenOfOwnerByIndex должен быть разрешен до продолжения цикла for.

См. Мой код для примера.

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

console.time('promise');
let c = 10;
for (let i = 0; i < 10; i++) {
  sleep(100)
    .then(() => {
      c--;
      if (c === 0) {
        console.timeEnd('promise');
      }
    });
}


console.time('await');
(async () => {
  let c = 10;
  for (let i = 0; i < 10; i++) {
    await sleep(100);
    c--;
    if (c === 0) {
      console.timeEnd('await');
    }
  }
})();
...