【问题标题】:Chaining async functions?链接异步函数?
【发布时间】:2017-02-26 14:04:45
【问题描述】:
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

我猜有一个我不知道的关于异步的基本问题?

【问题讨论】:

  • 只有thirdawait 的承诺结果,所有其他函数同步执行。除非你 await firstsecond,否则他们会立即返回。
  • 好吧,我对awaitasync 了解不多,但可以肯定的是,超时部分基本上允许其余代码完成,而await 等待超时完成? (或更具体地,Promise 完成)
  • 等等,什么版本的nodejs甚至支持这种语法?我已经尝试使用 v6.8.1,但它会引发语法错误。
  • @freakish 7 带有 --harmony 标志 node.green/#async-functions

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


【解决方案1】:

你必须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);
}

【讨论】:

  • 我忘记的最基本的事情是异步返回一个承诺。
【解决方案2】:

你需要使用

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 并不意味着它会神奇地阻塞其中的所有异步内容,相反 - 它的结果变成了一个 always 异步的承诺,您可以使用 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);
    }
}());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2020-02-18
    • 2021-10-14
    相关资源
    最近更新 更多