链接异步功能?

时间:2016-10-17 14:21:51

标签: javascript node.js promise async-await ecmascript-2017

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

我猜测有一个我不知道的异步的根本问题?

2 个答案:

答案 0 :(得分:4)

您必须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); } 所有异步函数调用:

run()

答案 1 :(得分: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);
    }
}());

where("(memberships.id IN (?) AND memberships.user_id = ?) OR (memberships.user_id = ? AND communities.hidden = ?)", m, user.id, nil, false)