了解 ECMAScript 中的 async/await 个提议

Understand async/await proposal in ECMAScript

正如async所说,pormise对象或者简单数据(比如数字或者字符串)都可以跟在await后面,当是简单数据时,就跟sync一样,我写的第一个程序如下:

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改成第二个文件就可以了reader:

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 版本中还没有这些功能,您可以使用 setTimeout 延迟 0 来模拟它。 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');