例如我们用 node.js fs 模块依次打开六个 TXT 文件。
1 const fs = require("fs"); 2 3 fs.readFile("./1.txt",function(err,data){ 4 console.log(data.toString()); 5 fs.readFile("./2.txt",function(err,data){ 6 console.log(data.toString()); 7 fs.readFile("./3.txt",function(err,data){ 8 console.log(data.toString()); 9 fs.readFile("./4.txt",function(err,data){ 10 console.log(data.toString()); 11 fs.readFile("./5.txt",function(err,data){ 12 console.log(data.toString()); 13 fs.readFile("./6.txt",function(err,data){ 14 console.log(data.toString()); 15 }); 16 }); 17 }); 18 }); 19 }); 20 });
此时就会陷入会点地狱代码毕竟是给人看的,但上面的代码,结构松散,难于读取。
如果直接使用Promise 改写
1 const fs = require("fs"); 2 3 function read(url){ 4 return new Promise(function(resolve,reject){ 5 fs.readFile(`./${url}.txt`,function(err,data){ 6 if(err)return; 7 resolve(data.toString());//专成字符串格式 8 }); 9 }); 10 } 11 read(1).then(function(data){//声明为先执行第一个然后在执行后面的 12 console.log(data); 13 read(2).then(function(data){//声明为先执行第一个然后在执行后面的 14 console.log(data); 15 read(3).then(function(data){//声明为先执行第一个然后在执行后面的 16 console.log(data); 17 read(4).then(function(data){//.... 18 console.log(data); 19 read(5).then(function(data){ 20 console.log(data); 21 read(6).then(function(data){ 22 console.log(data); 23 }); 24 }); 25 }); 26 }); 27 }); 28 }); 29
这并没发挥出 Promise 作为语法糖的作用。所以如果是单纯异步回调改写成 promise 是没啥大区别。打败了回调黑洞进入链式黑洞。但是结合async 和 await 就大不一样了。
结合async 和 await 再次改写
const fs = require("fs"); function read(url){//此函数实现读取传来的url为地址的文件 return new Promise(function(resolve,reject){ fs.readFile(`./${url}.txt`,function(err,data){ if(err)return; resolve(data.toString()); }); }); } async function main(){ var data1 = await read(1);//读取 console.log(data1);//输出 var data2 = await read(2); console.log(data2); var data3 = await read(3); console.log(data3); var data4 = await read(4); console.log(data4); var data5 = await read(5); console.log(data5); var data6 = await read(6); console.log(data6); } main();