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文件是吸星大法

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值