javascript - 异步/等待比回调慢
问题描述
我正在尝试将回调转换为 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);
}
解决方案
在第一个版本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');
}
}
})();
推荐阅读
- ios - 将 Powerapps 投射到 Chromecast
- solr - 分片处于“恢复”状态,副本都处于“活动状态”
- postgresql - 在 Postgresql 中删除字符
- apache-spark - 如何将带有时区的奇怪日期时间字符串转换为时间戳(PySpark)
- android - 如何在Android上的recyclerView中使用多个计时器
- android - 调试输出上的 Android net::ERR_CACHE_MISS
- python - 暂停 Jupyter Notebook 小部件,等待用户输入
- xaml - xamarin.forms 汉堡包图标
- python - 用熊猫读取具有可变列数的csv
- python - Python:%s 在这里做什么?