理解ECMAScript中的async/await提议

Understand async/await proposal in ECMAScript

本文关键字:await 提议 async ECMAScript 中的 理解      更新时间:2023-09-26

正如async所说,承诺对象或简单数据(如数字或字符串)可以跟随await,当它是简单数据时,它就像同步一样,我写了以下第一个程序:

let fs = require('fs');
async function readF(){
   let data1 = await fs.readFileSync('./file1.txt','utf-8');
   console.log(data1);
   let data2 = fs.readFileSync('./file2.txt','utf-8');
   console.log(data2);
}
readF();
console.log('outter hello');

,结果是:

outter hello
first file
second file

似乎readF函数是异步的?为什么?

,我写第二个程序,只是把await改为第二个文件读取器:

let fs = require('fs');
async function readF(){
   let data1 = fs.readFileSync('./file1.txt','utf-8');
   console.log(data1);
   let data2 = await fs.readFileSync('./file2.txt','utf-8');
   console.log(data2);
}
readF();
console.log('outter hello');
这次

,结果是:

first file
outter hello
second file

我不能理解这个奇怪的惊人的结果,我希望你能帮助我。

JavaScript是单线程的,这意味着它一次只能执行一件事。异步代码在所有同步代码完成后执行。

asyncawait的语法是标记为await的操作只能发生在标记为async的函数中,并且它标记了代码中同步代码完成后继续执行的点。

在还没有这些特性的JavaScript版本中,您可以使用setTimeout0延迟来模拟它。setTimeout异步执行回调函数。如果您将await之后的所有语句放入setTimeout块中,您可以看到行为是相同的:

function async(){
   setTimeout(function() {
       console.log("first file");
       console.log("second file");
   }, 0);
}
async();
console.log('outer hello');

function async(){
   console.log("first file");
   setTimeout(function() {
       console.log("second file");
   }, 0);
}
async();
console.log('outer hello');