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文件是吸星大法
相关推荐
zengyuhan5035 分钟前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
醉方休8 分钟前
Webpack loader 的执行机制
前端·webpack·rust
前端老宋Running17 分钟前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔17 分钟前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户44455436542619 分钟前
Android的自定义View
前端
WILLF20 分钟前
HTML iframe 标签
前端·javascript
枫,为落叶37 分钟前
Axios使用教程(一)
前端
小章鱼学前端42 分钟前
2025 年最新 Fabric.js 实战:一个完整可上线的图片选区标注组件(含全部源码).
前端·vue.js
ohyeah43 分钟前
JavaScript 词法作用域、作用域链与闭包:从代码看机制
前端·javascript
流星稍逝1 小时前
手搓一个简简单单进度条
前端