1

正如async所说,pormise对象或简单数据(例如数字或字符串)可以跟随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

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

4

1 回答 1

2

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

asyncand的语法await是标记为的操作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');

于 2016-08-16T03:47:35.673 回答