javascript - 异步/等待比回调慢

标签 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);
}

最佳答案

在第一个版本中,tokenOfOwnerByIndex 被称为返回 promise 。您通过 then 附加回调,然后循环继续。 promise 最终会解决,但您的 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');
    }
  }
})();

关于javascript - 异步/等待比回调慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894620/

相关文章:

javascript - 谷歌 Material 设计打字时增加文本区域

javascript - 单击时将按钮文本更改为粗体

javascript - 使用 Firefox 扩展的属性触发自定义事件

android - ScaleGestureDetector.OnScaleGestureListener.onScaleEnd() 方法没有被击中

javascript - Leaflet JS - 国家边界

ruby-on-rails-3 - 如何在子模型中使用 after_save 回调来更新父模型中的属性?

keras - tf.keras 如何保存 ModelCheckPoint 对象

c# - Web API请求内容为空

javascript - JavaScript 中的简单异步函数

调用异步方法的 C# Webservice : Webmethod,,返回 Taskoff 对象