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