【图书介绍】《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)。
- Resolve的作用是将Promise对象的状态从“未完成”变为“成功”(即从pending变为resolved),在异步操作成功时调用,并将异步操作的结果作为参数传递出去。
- 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文件是吸星大法