首页 > 解决方案 > 异步/等待比回调慢

问题描述

我正在尝试将回调转换为 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);
}

标签: javascriptcallbackasync-await

解决方案


在第一个版本tokenOfOwnerByIndex中称为返回一个承诺。您通过 附加回调then,然后循环继续。承诺最终会解决,但你的 for 循环在此之前很久就完成了。

当你使用 await 时,你会阻塞下面的代码,直到 promise 解决。这意味着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');
    }
  }
})();


推荐阅读