ES6之Promise对象

【图书介绍】《Node.js+MongoDB+Vue.js全栈开发实战》-CSDN博客

《Node.js+MongoDB+Vue.js全栈开发实战(Web前端技术丛书)》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com)

Promise是ES 6中新增的一种异步编程的解决方案,它可以将异步操作队列化,让操作按照期望的顺序执行,最终返回符合预期的结果。同时,可以在对象之间传递和操作Promise,帮助我们处理队列。

Promise出现的目的是解决Node.js异步编程中回调地狱的问题。什么是回调地狱呢?要把一个函数a作为回调函数,但是该函数又把函数b作为参数,而函数b又把函数c作为参数,这样的层层嵌套称之为回调地狱。回调地狱的代码阅读性非常差。

Promise是一个对象,它并未剥夺函数return的能力,因此无须层层传递callback进行回调来获取数据。

Promise的基本结构:Promise((resolve, reject)。

  1. Resolve的作用是将Promise对象的状态从"未完成"变为"成功"(即从pending变为resolved),在异步操作成功时调用,并将异步操作的结果作为参数传递出去。
  2. Reject的作用是将Promise对象的状态从"未完成"变为"失败"(即从pending变为rejected),在异步操作失败时调用,并将异步操作报出的错误作为参数传递出去。

Promise有3个状态:

(1)pending(待定),是初始状态。

(2)resolved(已完成),又称fulfilled(实现),表示操作成功。

(3)rejected(被否决),表示操作失败。

当Promise状态发生改变时,就会触发then()里的响应函数来处理后续操作。Promise状态一经改变,不会再变。

下面用示例来演示Promise的基本用法。

(1)新建文件promise.js,添加如下代码:

复制代码
const fs = require('fs');
let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (true) {
      resolve({ name: '张三丰' });
    } else {
      reject('失败');
    }
  }, 1000);
});
promise
  .then(
    (result) => console.log(result) // {name: '张三丰'})
  )
  .catch((error) => console.log(error)); // 失败

(2)通过Promise的方式来实现前面3.6.3节中回调的例子,在promise.js中添加如下代码:

复制代码
const fs = require('fs');
//封装Promise对象到方法中
function p1() {
  return new Promise((resolve, reject) => {
    fs.readFile('a.txt', 'utf8', (err, res) => {
      resolve(res);
    });
  });
}
function p2() {
  return new Promise((resolve, reject) => {
    fs.readFile('b.txt', 'utf8', (err, res) => {
      resolve(res);
    });
  });
}
//调用
p1()
  .then((res) => {
    console.log(res);
    return p2();
  })
  .then((res) => {
    console.log(res);
  });

(3)执行node promise.js,结果如下:

复制代码
PS D:\WorkSpace\node_mongodb_vue3_book\codes\chapter3> node promise.js
a文件是独孤九剑
b文件是吸星大法
相关推荐
前端大波几秒前
使用webpack-bundle-analyzer 对 react 老项目进行打包优化
前端·react.js·webpack·性能优化
前端 贾公子7 分钟前
(catalog协议) == pnpm (5)
前端·javascript·react.js
JarvanMo12 分钟前
深度解析:如何彻底终结 Flutter 异步操作中的 BuildContext 崩溃?
前端
wxr061616 分钟前
部署Spring Boot项目+mysql并允许前端本地访问
前端·spring boot·mysql·持续部署
假装我不帅22 分钟前
jquery-validation使用
前端·javascript·jquery
怕浪猫27 分钟前
React从入门到出门第六章 事件代理机制与原生事件协同
前端·javascript·react.js
天府之绝31 分钟前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
be or not to be32 分钟前
Html-CSS动画
前端·css·html
初恋叫萱萱38 分钟前
技术基石与职场进阶:构建从Web后端到高性能架构的完整知识图谱
前端·架构·知识图谱
木木木一41 分钟前
Rust学习记录--C9 错误处理
前端·学习·rust