zoukankan      html  css  js  c++  java
  • 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();
    
     
  • 相关阅读:
    jqGrid Demos
    响应式web设计之CSS3 Media Queries
    固定表头带滚动条的HTML表格
    eclipse不自动弹出提示(alt+/快捷键失效)
    用ant打包可运行的jar文件 (将第三方jar包放进你自己的jar包)
    lufylegend库 LButton
    lufylegend库 鼠标事件 循环事件 键盘事件
    lufylegend库 LTextField
    jsp内置对象 的使用范围和类型【说明】
    struts2 maven整合tiles3
  • 原文地址:https://www.cnblogs.com/moluxi/p/13046604.html
Copyright © 2011-2022 走看看