理解ECMAScript中的async/await提议
Understand async/await proposal in ECMAScript
正如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是单线程的,这意味着它一次只能执行一件事。异步代码在所有同步代码完成后执行。
async
和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');
相关文章:
- 如何在 es6 javascript 类中使用 async/await
- 使用Babel.js的Transpile Async Await提案
- 为什么babel将async/await转换为再生器
- 如何在我的gulpfile.babel.js中使用ES2016/ES7提案进行async/await
- Nodejs中的async/await替换
- async/await w/ koa 2 & mongoose
- 如何在 Node JS FS 模块中使用 Typescript Async/ await with promise
- Typescript async/await and angular $q service
- 几乎可以在任何地方使用 async/await 吗?
- JavaScript在我的函数调用中使用await
- 为什么从异步/等待提案中删除了 await*
- 将 redux-saga 与 ES6 生成器与 ES2017 async/await 一起使用 redux-thunk
- Packey图像网格只有在CSS中定义背景图像时才起作用,而不是通过Javascript.Await/Semaphore
- '意外的令牌'使用await关键字时出错
- 如何在Gulp 4中使用async/await
- Typescript async/await Promise调用差异
- async/await and recursion
- javascript : Async/await in .replace
- babel 6 async/await:意外的令牌
- 理解ECMAScript中的async/await提议