[英]Chaining async functions?
let val = 0;
async function first() {
console.log('1a', val);
second();
console.log('1b', val);
}
async function second() {
console.log('2a', val);
third();
console.log('2b', val);
}
async function third() {
console.log('3a', val);
val = await new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(3);
}, 1000);
});
console.log('3b', val);
}
console.log('0a', val);
first();
console.log('0b', val);
我期待:
0a 0
1a 0
2a 0
3a 0
3b 3
2b 3
1b 3
0b 3
但我收到了:
0a 0
1a 0
2a 0
3a 0
2b 0
1b 0
0b 0
3b 3
我猜我有一個關於異步的基本問題我不知道?
您將不得不await
所有異步函數調用:
async function first() {
console.log('1a', val);
await second();
console.log('1b', val);
}
async function second() {
console.log('2a', val);
await third();
console.log('2b', val);
}
你需要使用
async function first() {
console.log('1a', val);
await second();
// ^^^^^
console.log('1b', val);
}
async function second() {
console.log('2a', val);
await third();
// ^^^^^
console.log('2b', val);
}
在異步執行被調用函數之后鏈接b
日志。
它也是一樣的
console.log('0a', val);
first();
console.log('0b', val);
只是你不能await
這里使用await
,因為你不在aync function
。 使函數async
並不意味着它神奇地阻塞其內部的異步,相反 - 它的結果變成了一個始終異步的承諾,你可以使用await
關鍵字。 所以要使0b
等待,你可以使用其中之一
console.log('0a', val);
first().then(function() {
console.log('0b', val);
}, function(err) {
console.error(err);
});
要么
(async function() {
try {
console.log('0a', val);
first();
console.log('0b', val);
} catch(err) {
console.log(err);
}
}());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.