我正在尝试将回调转换为异步/等待,但是发现异步/等待比现有回调慢得多。谁能看到我的异步/等待出现了什么问题?
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);
}
答案 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');
}
}
})();