我在工作应用程序上遇到了这个编码问题,我想学习和理解,所以这里是编码问题,然后我将提供我的解释,并请SO社区详细阐述/纠正我的解释:
async function someFunction() {
console.log('someFunction'):
}
console.log('start');
someFunction();
console.log('end');
我认为这里的输出现在的顺序可以说是不可预测的,仅仅是因为我们知道以someFunction
开头的console.log
的实现将是:
我已经在浏览器中运行了此代码,并且确实看到它始终按此顺序运行。我只是不确定原因。
在线阅读内容时,“忘记”执行await
的关键字async someFunction
仍将异步执行。
我的推理是,尽管someFunction
是异步的并返回了一个Promise,但someFunction的第一行执行将发生在console.log('end')之前。我不确定为什么许多开发人员认为这些是很好的招聘问题,也许是。我只是发现它们是不是真实世界的技巧性问题。在现实世界中,someFunction
返回的诺言将得到处理,例如:
console.log('start');
await someFunction();
console.log('end');
请您对此代码进行解释。
答案 0 :(得分:2)
这里的顺序是完全确定的,它将始终为start
-> someFunction
-> end
:
async function someFunction() {
console.log('someFunction');
}
console.log('start');
someFunction();
console.log('end');
这是因为只有await
会暂停异步功能的执行。 await
之前的任何代码将同步执行,而await
之后的任何代码仅在承诺await
被解决后才能运行:
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
是与众不同的所在。