簡體   English   中英

鏈接異步功能?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM