• 技术文章 >web前端 >js教程

    详细了解Nodejs中的Promise对象

    青灯夜游青灯夜游2021-03-30 18:44:34转载318
    本篇文章带大家了解一下Nodejs中的Promise对象。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

    相关推荐:《nodejs 教程

    Promise对象

    1. promise用来做什么?

    我们的需求是一次的去执行异步代码

    我们的做法是在异步请求成功后的回调函数里,执行下一个异步请求

    但是这样就出现了回调地狱(回调函数中嵌套了回调函数,代码的阅读性 低,维护不变,让人看着害怕)

    promise就是用来解决回调地狱的

    回调地狱示例:

    // 需求:一次的读取a,b,c这三个文件
    const fs = require("fs");
    
    // 读a文件
    fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => {
      if (err) {
        console.log(err);
      } else {
        console.log(data);
        // 读b文件
        fs.readFile(`${__dirname}/etc/b.txt`, "utf-8", (err, data) => {
          if (err) {
            console.log(err);
          } else {
            console.log(data);
            // 读c文件
            fs.readFile(`${__dirname}/etc/c.txt`, "utf-8", (err, data) => {
              if (err) {
                console.log(err);
              } else {
                console.log(data);
              }
            });
          }
        });
      }
    });

    2. promise工作流程

    es6的语法,es6.ruanyifeng.com

    Promise对象是一个构造函数 ,用来生成promise实例

    Promise构造函数接受一个函数作为参数

    这个作为参数的函数,又有两个参数,这两个参数分别是resolve和reject

    这两个参数它们也是函数,只不过这两个函数由 javascript 引擎提供,不用自己部署

    异步操作成功后调用resolve()方法,他内部调用了then()里面的第一个参数函数

    异步操作成功后调用reject()方法,他内部调用了then()里面的第二个参数函数.

    const fs = require("fs");
    // 调用Promise构造函数,创建一个promise的实例
    let p = new Promise((resolve, reject) => {
      // 写异步操作(读文件)
      fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => {
        if (!err) {
          // 操作成功(读文件成功)
          resolve(data); // 调用resolve方法
          // 调用then()里面的第一个参数函数
        } else {
          reject(err); // 调用reject方法
          // 调用then()里面的第二个参数函数
        }
      });
    });
    
    p.then(
      (data) => {
        console.log(data);
      },
      (err) => {
        console.log(err);
      }
    );

    3. promise原理

    Promise对象代表一个异步操作.

    有三种状态: pending (进行中)、fulfilled (已成功)和rejected (已失败)

    Promise对象的状态改变,只有两种可能:从pending变 为fulfilled和从pending变为rejected。

    只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态

    如果异步操作成功了(读文件成功了),从pending (进行中)变为 fulfilled (已成功) ;

    如果异步操作失败了(读文件失败了),从pending (进行中)变为 rejected (已失败) ;

    状态如果已经确定了, 就不会再去改变这个状态了

    4. promise特点及其封装

    Promise新建后就会立即执行

    所以不要在promise里面写其他的代码,只写这个异步操作的代码就可以了

    const fs = require("fs");
    function getPromise(filename) {
      // 调用Promise构造函数,创建一个promise的实例
      return new Promise((resolve, reject) => {
        // 写异步操作(读文件)
        fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
          if (!err) {
            // 操作成功(读文件成功)
            resolve(data); // 调用resolve方法
            // 调用then()里面的第一个参数函数
          } else {
            reject(err); // 调用reject方法
            // 调用then()里面的第二个参数函数
          }
        });
      });
    }
    
    // console.log(getPromise("a"));
    getPromise("a").then(
      (data) => {
        console.log(data);
      },
      (err) => {
        console.log(err);
      }
    );

    5. promise正确写法

    promise如何解决回调地狱

    -》 链式编程解决

    **我们用promise解决的问题:让异步操作有顺序,并且不能有回调地狱 **

    让异步操作有顺序本质是:

    异步操作实际上是没有顺序的

    在异步操作成功后的回调函数里返回另外的promise,调用他的then方法

    const fs = require("fs");
    function getPromise(filename) {
      // 调用Promise构造函数,创建一个promise的实例
      return new Promise((resolve, reject) => {
        // 写异步操作(读文件)
        fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
          if (!err) {
            // 操作成功(读文件成功)
            resolve(data); // 调用resolve方法
            // 调用then()里面的第一个参数函数
          } else {
            reject(err); // 调用reject方法
            // 调用then()里面的第二个参数函数
          }
        });
      });
    }
    
    // console.log(getPromise("a"));
    getPromise("a")
      .then((data) => {
        console.log(data);
        //调用函数得到一个读b文件的promise对象并返回
        return getPromise("b");
      })
      .then((data) => {
        console.log(data);
        //调用函数得到一个读c文件的promise对象并返回
        return getPromise("c");
      })
      .then((data) => {
        console.log(data);
      });

    6. promise的其他方法

    更多编程相关知识,请访问:编程视频!!

    以上就是详细了解Nodejs中的Promise对象的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:Nodejs Promise对象
    上一篇:Javascript属于哪种语言类型 下一篇:详解Angular中的Observable(可观察对象)
    大前端线上培训班

    相关文章推荐

    • 浅谈Nodejs关闭进程的方法• nodejs怎么创建文件并写入• Nodejs如何操作数据库(增删改查)?• 浅谈Nodejs中Set和Map的用法• 浅谈Nodejs中内置模块的基本用法

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网