问题背景
- 如下代码
readFile是异步函数,它不会按照代码顺序返回文件读取的内容,要怎么解决这个问题?
const fs = require('fs');
fs.readFile('1.txt','utf8',(err,result)=>{
console.log(result);
});
fs.readFile('2.txt','utf8',(err,result)=>{
console.log(result);
});
fs.readFile('3.txt','utf8',(err,result)=>{
console.log(result);
});
方法一
- 该方法能够按照代码执行顺序读取文件,但是容易造成回调地狱的问题。
const fs = require('fs');
fs.readFile('1.txt','utf8',(err,result1)=>{
console.log(result1);
fs.readFile('2.txt','utf8',(err,result2)=>{
console.log(result2);
fs.readFile('3.txt','utf8',(err,result3)=>{
console.log(result3);
});
});
});
方法二
- 用promise对象可使用链式编程,改造回调地狱的问题,但是代码冗余
const fs = require('fs');
function p1(){
return new Promise((resolve,reject)=>{
fs.readFile('1.txt','utf8',(err,result)=>{
resolve(result);
});
});
}
function p2(){
return new Promise((resolve,reject)=>{
fs.readFile('2.txt','utf8',(err,result)=>{
resolve(result);
});
});
}
function p3(){
return new Promise((resolve,reject)=>{
fs.readFile('3.txt','utf8',(err,result)=>{
resolve(result);
});
});
}
p1().then((r1)=>{
console.log(r1);
return p2();
}).then((r2)=>{
console.log(r2);
return p3();
}).then((r3)=>{
console.log(r3);
})
方法三
- 改造现有异步函数api 让其返回promise对象 从而支持异步函数语法
- 调用promisify方法 让其返回promise对象
const fs = require('fs');
//改造现有异步函数api 让其返回promise对象 从而支持异步函数语法
const promisify = require('util').promisify;
//调用promisify方法 让其返回promise对象
const readFile = promisify(fs.readFile);
async function run(){
let r1 = await readFile('1.txt','utf8')
let r2 = await readFile('2.txt','utf8')
let r3 = await readFile('3.txt','utf8')
console.log(r1);
console.log(r2);
console.log(r3);
}
run();
总结
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。
async关键字
- 1.在普通函数定义的前面加上async关键字 普通函数就变成了异步函数
- 2.异步函数默认的返回值是promise对象
- 3.在异步函数内部使用throw关键字进行错误的抛出
- 4.调用异步函数再链式调用then方法获取异步函数的执行结果
- 5.在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字替代了resolve方法
await关键字
- 1.它只能出现在异步函数中
- 2.await后面只能写promise对象 写其他类型的API是不可以的
- 3.它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行函数
本文总结了解决异步问题的多种方案,包括传统的回调函数、Promise的链式调用来避免回调地狱,以及使用Node.js的async/await语法糖。async/await使得异步代码看起来更像同步代码,提高了代码可读性,但需要注意其使用规则,如只能在异步函数中使用,await后面必须跟Promise对象。
168万+

被折叠的 条评论
为什么被折叠?



