4
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

我猜关于异步有一个基本的东西我不知道吗?

4

2 回答 2

4

您将必须进行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);
}
于 2016-10-17T14:28:02.377 回答
3

您将需要使用

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在这里使用,因为你不在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);
    }
}());
于 2016-10-17T14:29:35.667 回答