javascript - 等待破坏秩序

标签 javascript asynchronous async-await

请解释一下,为什么 await 关键字会导致 Hello World 文本被放置在中间(第一个示例)和末尾(第二个示例)输出?

第一个示例:

const getData = async() => { 
    var y = "Hello World"; 
    console.log(y); 
} 

console.log(1); 
getData(); 
console.log(2); 

第一个示例的输出:

1
Hello World
2

第二个示例:

const getData = async() => { 
    var y = await "Hello World"; 
    console.log(y); 
} 

console.log(1); 
getData(); 
console.log(2); 

第二个示例的输出:

1
2
Hello World

最佳答案

两个示例都返回一个 Promise,但是脚本引擎正在寻找一个关键的区别......其中是否有任何异步等待?在第一个示例中没有,但在第二个示例中,代码至少有。 (尽管我可能希望任何像样的 IDE 都会提示它,因为字符串文字不是异步操作。不过,语言本身对此可以相当宽容。)

即使您在第一个示例中执行了异步操作,除非您等待它,否则周围的代码仍然会同步运行。您只是没有任何方法来观察该操作的结果(或失败)。 (好吧,您可以将 .then() 附加到它,但是为什么要使用 async?那时您将混合异步约定。)

如果您在 async 函数中调用 getData(),那么您可以等待它:

console.log(1);
await getData();
console.log(2);

或者,您也可以从返回的 promise 继续:

console.log(1);
getData().then(() => console.log(2));

或者,更详细地说(或者对于任何陷入 IE 的人):

console.log(1);
getData().then(function () {
    console.log(2);
});

关于javascript - 等待破坏秩序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59884760/

相关文章:

JavaScript 数组操作

javascript - 回调不是异步 echOfSeries 中的函数

javascript - while 循环中的异步函数

c# - 当内部调用不是自然异步时,如何创建自然异步方法?

c# - ICriticalNotifyCompletion 有什么用?

javascript - Enyo MVC实现和粒 subview 渲染

javascript - 拆分 grunt watch 任务

delphi - 如何在Delphi中异步调用函数/过程(无组件)

c# - 最后锁定后,代码未在 IAsyncEnumerable 迭代器中执行

javascript - angular js从范围div和span元素中选择所有文本以让用户复制所选文本