在工作应用程序上向我提出了这个编码问题,我想学习和理解,所以这里是编码问题,然后我将提供我的解释,并请SO社区详细阐述/纠正我的解释:
async function someFunction() {
console.log('someFunction'):
}
console.log('start');
someFunction();
console.log('end');
在我看来,这里的输出可以说是不可预测的,现在的顺序,仅仅是因为我们知道
someFunction
以console.log
开头的实现将是:开始
someFunction
结束
我已经在浏览器中运行了此代码,并且确实看到它始终按此顺序运行。我只是不确定原因。
在线阅读,“忘记”
await
关键字以执行async someFunction
该功能仍将异步执行。我的理由是,尽管
someFunction
是异步的并返回一个Promise,但someFunction的第一行执行将发生在console.log('end')之前。我不确定为什么许多开发人员认为这些是很好的招聘问题,也许是。我只是发现它们是不是真实世界的技巧性问题。在现实世界中,将处理someFunction
返回的承诺,例如:console.log('start');
await someFunction();
console.log('end');
我希望对此代码进行解释。
最佳答案
这里的顺序是完全确定的,它将始终为start
-> someFunction
-> end
:
async function someFunction() {
console.log('someFunction');
}
console.log('start');
someFunction();
console.log('end');
这是因为只有
await
会暂停异步功能的执行。 await
之前的任何代码将同步执行,而await
之后的任何代码仅在兑现承诺await
ed后运行:async function someFunction() {
console.log('someFunction - before await');
await otherFunction();
console.log('someFunction - after await');
}
async function otherFunction() {
console.log('otherFunction');
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('promise resolved');
resolve();
}, 0);
});
}
console.log('start');
someFunction();
console.log('end');
如果您具有可以执行多个操作的非平凡的异步功能,并且它们的顺序是重要的,那么这可以发挥作用:
//sample shared variable
let counter = 1;
async function someFunction() {
console.log('someFunction - before await counter is:', counter);
let awaitResult = await otherFunction();
console.log('someFunction - after await counter is: ', counter, '\nawaited function returned: ', awaitResult);
}
async function otherFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(counter);
}, 0);
});
}
someFunction();
counter += 1;
这是一个愚蠢的示例,但它展示了可能发生的情况-如果您阅读
someFunction
,则可以假定counter
两次都具有相同的值。但这是不正确的,因为变量的突变发生在第一次读取之后和第二次读取之前。 await
是什么与众不同。关于javascript - 此node/es6代码的输出是什么,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58292067/