Javascript 了解ECMAScript中的异步/等待建议

Javascript 了解ECMAScript中的异步/等待建议,javascript,async-await,ecmascript-next,Javascript,Async Await,Ecmascript Next,正如async所说,pormise对象或简单数据(如数字或字符串)可以后跟wait,当它是简单数据时,它就像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'

正如async所说,pormise对象或简单数据(如数字或字符串)可以后跟wait,当它是简单数据时,它就像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函数似乎是异步的?为什么?

我编写了第二个程序,只需将wait改为第二个文件读取器:

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是单线程的,这意味着它在任何时候只能执行一件事情。异步代码在所有同步代码完成时执行

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

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

函数异步(){
setTimeout(函数(){
log(“第一个文件”);
console.log(“第二个文件”);
}, 0);
}
异步();

log('outerhello')
async/await不是ES2016的一部分“看起来readF函数是异步的?为什么?”因为您将其定义为
async function readF(){}
<代码>让数据1=等待x;console.log(data1)基本上是
Promise.resolve(x).then(data1=>console.log(data1);)
的语法糖<代码>。然后回调总是异步解析。异步是ES7(ES2016)的一部分。您熟悉异步代码吗?尝试执行
setTimeout(readF,0)
,结果将与第一个示例相同,没有
async
关键字-我明白了,非常感谢