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文件是吸星大法
相关推荐
爱学习的小仙女!8 分钟前
面试题 前端(一)DOCTYPE作用 标准模式与混杂模式区分
前端·前端面试题
小小小小宇1 小时前
前端转后端基础- 变量和类型
前端
Cobyte2 小时前
1.基于依赖追踪和触发的响应式系统的本质
前端·javascript·vue.js
主宰者2 小时前
C# CommunityToolkit.Mvvm全局事件
java·前端·c#
前端小咸鱼一条2 小时前
16.迭代器 和 生成器
开发语言·前端·javascript
小江的记录本3 小时前
【注解】常见 Java 注解系统性知识体系总结(附《全方位对比表》+ 思维导图)
java·前端·spring boot·后端·spring·mybatis·web
web守墓人3 小时前
【前端】记一次将ruoyi vue3 element-plus迁移到arco design vue的经历
前端·vue.js·arco design
伊步沁心3 小时前
Webpack & Vite 深度解析
前端
libokaifa3 小时前
OpenSpec + TDD:让 AI 写代码,用测试兜底
前端·ai编程
用户15815963743703 小时前
搭 AI Agent 团队踩了 18 个坑,总结出这 5 个关键步骤
前端