在工作应用程序上向我提出了这个编码问题,我想学习和理解,所以这里是编码问题,然后我将提供我的解释,并请SO社区详细阐述/纠正我的解释:

async function someFunction() {
    console.log('someFunction'):
}

console.log('start');
someFunction();
console.log('end');


在我看来,这里的输出可以说是不可预测的,现在的顺序,仅仅是因为我们知道someFunctionconsole.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/

10-13 01:54