Promise结合async和await的使用

Promise结合async和await的使用

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

 

 

posted @ 2020-06-04 21:25  书昀  阅读(1778)  评论(0编辑  收藏  举报