异步/等待比回调慢

时间:2019-07-04 22:07:15

标签: javascript callback 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 个答案:

答案 0 :(得分:1)

在第一个版本中,tokenOfOwnerByIndex被称为返回承诺。您通过then附加了一个回调,然后循环继续进行。这个诺言最终会解决,但是您的for循环早于此完成。

使用await时,您将阻止以下代码,直到承诺解决为止。这意味着在for循环继续之前,对tokenOfOwnerByIndex的每次调用都必须解析。

有关示例,请参见我的代码。

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');
    }
  }
})();