例如我們用 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();