Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步/等待比回调慢_Javascript_Callback_Async Await - Fatal编程技术网

Javascript 异步/等待比回调慢

Javascript 异步/等待比回调慢,javascript,callback,async-await,Javascript,Callback,Async Await,我试图将回调转换为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);

我试图将回调转换为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{
tokenURI().call(id).then((uri)=>{
log(uri);
});
});         
}
for(变量i=0;i
在第一个版本中,tokenOwnerByIndex
被称为返回承诺。您先通过
附加回调,然后通过
,循环继续。承诺最终会解决,但for循环早就完成了

当您使用wait时,您将阻塞以下代码,直到承诺得到解决。这意味着在for循环继续之前,必须解析对
tokenOfOwnerByIndex
的每个调用

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

功能睡眠(毫秒){
返回新承诺((解决)=>{
设置超时(解析,毫秒);
});
}
时间(“承诺”);
设c=10;
for(设i=0;i<10;i++){
睡眠(100)
.然后(()=>{
c--;
如果(c==0){
控制台。时间结束(“承诺”);
}
});
}
控制台时间(“等待”);
(异步()=>{
设c=10;
for(设i=0;i<10;i++){
等待睡眠(100);
c--;
如果(c==0){
console.timeEnd(“等待”);
}
}

})();您正在比较的回调代码是什么?我在代码中没有看到任何计时机制,如何验证一个比另一个慢?您的第一个版本并行调用了
tokenOfOwnerByIndex()
多次。你的第二个版本做了系列中的所有事情。你可以这样修复它:ok有意义。所以在这种情况下,我应该坚持回调?如果异步函数不是相互依赖的,那么是的——以并行方式运行它们,这是异步代码的完美用例。您也可以将所有返回的承诺放在一个数组中,并使用一个当前的承诺组合符,如
Promise.all
如果您需要解决所有承诺,或者
Promise.race
如果您需要在任何承诺被拒绝时退出。或者我在一个JSFIDLE中发布的代码,它只是将等待转换为一个异步立即调用的箭头函数。
\uu
在JSFIDLE中紧跟在async之后是什么意思?
\u
是一个有效的Javascript标识符,实际上是async arrow函数的参数。如果不需要,可以编写
async()=>…
for (var i = 0; i < balance; i++) {
  var id = await this.getTokenOfOwnerByIndex(i);
  var uri = await this.getTokenURI(id);
  console.log(uri);
}