Nodejs Promise对象
Promise对象
1. promise用来做什么?
我们的需求是一次的去执行异步代码
我们的做法是在异步请求成功后的回调函数里,执行下一个异步请求
但是这样就出现了回调地狱(回调函数中嵌套了回调函数,代码的阅读性 低,维护不变,让人看着害怕)
promise就是用来解决回调地狱的
回调地狱示例:
// 需求:一次的读取a,b,c这三个文件
const fs = require("fs");// 读a文件
fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => {if (err) {console.log(err);} else {console.log(data);// 读b文件fs.readFile(`${__dirname}/etc/b.txt`, "utf-8", (err, data) => {if (err) {console.log(err);} else {console.log(data);// 读c文件fs.readFile(`${__dirname}/etc/c.txt`, "utf-8", (err, data) => {if (err) {console.log(err);} else {console.log(data);}});}});}
});
2. promise工作流程
es6的语法,es6.ruanyifeng.com
Promise对象是一个构造函数 ,用来生成promise实例
Promise构造函数接受一个函数作为参数
这个作为参数的函数,又有两个参数,这两个参数分别是resolve和reject
这两个参数它们也是函数,只不过这两个函数由 javascript 引擎提供,不用自己部署
异步操作成功后调用resolve()方法,他内部调用了then()里面的第一个参数函数
异步操作成功后调用reject()方法,他内部调用了then()里面的第二个参数函数.
const fs = require("fs");
// 调用Promise构造函数,创建一个promise的实例
let p = new Promise((resolve, reject) => {// 写异步操作(读文件)fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => {if (!err) {// 操作成功(读文件成功)resolve(data); // 调用resolve方法// 调用then()里面的第一个参数函数} else {reject(err); // 调用reject方法// 调用then()里面的第二个参数函数}});
});p.then((data) => {console.log(data);},(err) => {console.log(err);}
);
3. promise原理
Promise对象代表一个异步操作.
有三种状态: pending (进行中)、fulfilled (已成功)和rejected (已失败)
Promise对象的状态改变,只有两种可能:从pending变 为fulfilled和从pending变为rejected。
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态
如果异步操作成功了(读文件成功了),从pending (进行中)变为 fulfilled (已成功) ;
如果异步操作失败了(读文件失败了),从pending (进行中)变为 rejected (已失败) ;
状态如果已经确定了, 就不会再去改变这个状态了
4. promise特点及其封装
Promise新建后就会立即执行
所以不要在promise里面写其他的代码,只写这个异步操作的代码就可以了
const fs = require("fs");
function getPromise(filename) {// 调用Promise构造函数,创建一个promise的实例return new Promise((resolve, reject) => {// 写异步操作(读文件)fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {if (!err) {// 操作成功(读文件成功)resolve(data); // 调用resolve方法// 调用then()里面的第一个参数函数} else {reject(err); // 调用reject方法// 调用then()里面的第二个参数函数}});});
}// console.log(getPromise("a"));
getPromise("a").then((data) => {console.log(data);},(err) => {console.log(err);}
);
5. promise正确写法
promise如何解决回调地狱
-》 链式编程解决
**我们用promise解决的问题:让异步操作有顺序,并且不能有回调地狱 **
让异步操作有顺序本质是:
异步操作实际上是没有顺序的
在异步操作成功后的回调函数里返回另外的promise,调用他的then方法
const fs = require("fs");
function getPromise(filename) {// 调用Promise构造函数,创建一个promise的实例return new Promise((resolve, reject) => {// 写异步操作(读文件)fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {if (!err) {// 操作成功(读文件成功)resolve(data); // 调用resolve方法// 调用then()里面的第一个参数函数} else {reject(err); // 调用reject方法// 调用then()里面的第二个参数函数}});});
}// console.log(getPromise("a"));
getPromise("a").then((data) => {console.log(data);//调用函数得到一个读b文件的promise对象并返回return getPromise("b");}).then((data) => {console.log(data);//调用函数得到一个读c文件的promise对象并返回return getPromise("c");}).then((data) => {console.log(data);});
6. promise的其他方法
catch()
能够抓取错误的
const fs = require("fs"); function getPromise(filename) {// 调用Promise构造函数,创建一个promise的实例return new Promise((resolve, reject) => {// 写异步操作(读文件)fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {if (!err) {// 操作成功(读文件成功)resolve(data); // 调用resolve方法// 调用then()里面的第一个参数函数} else {reject(err); // 调用reject方法// 调用then()里面的第二个参数函数}});}); }// console.log(getPromise("a")); getPromise("a").then((data) => {console.log(data);//调用函数得到一个读b文件的promise对象并返回return getPromise("b");}).then((data) => {console.log(data);//调用函数得到一个读c文件的promise对象并返回return getPromise("c");}).then((data) => {console.log(data);}).catch((err) => {console.log(err);});
all()
const fs = require("fs"); function getPromise(filename) {// 调用Promise构造函数,创建一个promise的实例return new Promise((resolve, reject) => {// 写异步操作(读文件)fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {if (!err) {// 操作成功(读文件成功)resolve(data); // 调用resolve方法// 调用then()里面的第一个参数函数} else {reject(err); // 调用reject方法// 调用then()里面的第二个参数函数}});}); }let p1 = getPromise("a"); let p2 = getPromise("b"); let p3 = getPromise("c");// Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例 let pAll = Promise.all([p1, p2, p3]); // 一个都不能少,每一个promise都要读取成功才会成功,相当于是并且 pAll.then((data) => {console.log(data); });
race
const fs = require("fs"); function getPromise(filename) {// 调用Promise构造函数,创建一个promise的实例return new Promise((resolve, reject) => {// 写异步操作(读文件)fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {if (!err) {// 操作成功(读文件成功)resolve(data); // 调用resolve方法// 调用then()里面的第一个参数函数} else {reject(err); // 调用reject方法// 调用then()里面的第二个参数函数}});}); }let p1 = getPromise("a"); let p2 = getPromise("b"); let p3 = getPromise("c");// Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例 let pRace = Promise.race([p1, p2, p3]); // 只要有一个promise执行成功,那这个pRace就成功,相当于是或者 pRace.then((data) => {console.log(data); });
Nodejs Promise对象相关推荐
- Nodejs Promise 读书笔记
Nodejs Promise 读书笔记 前言 Promise是抽象异步处理对象以及对其进行各种操作的组件.(Promise并不是从JavaScript中发源的概念).简单说就是一个容器, 里面保存着某 ...
- javascript之异步操作理解---回调函数,async,await以及promise对象
javascript之异步操作理解---回调函数,async,await以及promise对象 概述 概述 写在前面:虽然平时做项目,但是发现自己写的代码还是很烂.最近接触了一个对性能要求比较高的项目 ...
- bluebird与原生Promise对象及bluebird模块的中文API文档
bluebird与原生Promise对象及bluebird模块的中文API文档 2016年06月15日 9392 声明 https://itbilu.com/nodejs/npm/VJ ...
- 【ES6】Promise对象详解
[ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...
- Promise对象和async函数
Promise对象 //1开始 function fna(){console.log('1开始');var p = new Promise(function(resolve, reject){ //做 ...
- 浅谈Promise对象在ReactNative中的使用
下面开始: 写在前面 假设现在一个日常开发会遇到这样一个需求:多个接口异步请求,第二个接口依赖于第一个 接口执行完毕之后才能利用数据进行一系列操作.一般会这样写: A.fetchData({url: ...
- ES6之路第十二篇:Promise对象
Promise的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Prom ...
- 谈谈 ES6 的 Promise 对象
2019独角兽企业重金招聘Python工程师标准>>> 谈谈 ES6 的 Promise 对象 异步编程 promise es6 javascript 前言 开篇首先设想一个日常开发 ...
- Promise对象的创建与使用
为什么要使用promise? 它指定回调函数的方式更加灵活,当new出一个promise的时候,这个任务就立刻开始执行了,后面的回调函数会在异步执行完后进行回调,在没有promise之前就不一样了:必 ...
最新文章
- promise 和 async await区别
- 2021年春季学期-信号与系统-第九次作业参考答案-第二小题
- AMDP + XLSX Workbench 报表开发模式
- WordPress更新时提示无法连接到FTP服务器的解决方案
- 堆和堆傻傻分不清?一文告诉你 Java 集合中「堆」的最佳打开方式
- soap php 分开类,将请求处理到同一PHP SOAP服务器中的多个类
- javafx应用启动自动执行函数_一张图,理顺 Spring Boot应用在启动阶段执行代码的几种方式...
- Apache负载均衡+Tomcat集群
- 前端学习(1813):前端调试之微博个人banner开发
- 【今日CV 视觉论文速览】30 Nov 2018
- CMMI 知识扫盲篇
- linux中mysql启动时遇到MySql server PID file cound not be found
- 麻烦不断的国外科技公司排行榜:苹果惨上榜
- 详解navigator对象
- 知乎zhihu:Python爬取某个问题下所有含有给定关键词的回答
- 教你快速给多段视频添加同一个片尾和转场特效
- tensorflow 之tf.Session
- 【阅读总结】ROSE: A Retinal OCT-Angiography Vessel Segmentation Dataset and New Model
- elasticsearch 实践
- 企业是该重新审视《个人信息保护法》了
热门文章
- 知识技能归档--CA-PKI体系-20210324
- android alarmmanager定时任务,AlarmManager 实现定时任务
- 中如何调取api_【技巧】不去腾讯公司也能调取微信交易流水清单
- mysql使用条件限制乐观锁_使用Mysql乐观锁解决并发问题
- 对于网络爬虫的提问?
- mysql读写分离 同步_MySQL数据库的同步配置+MySql读写分离
- 《只是为了好玩-Linux之父Linus自传》
- 远程桌面连接服务器,提示身份验证错误,要求的函数不受支持,但又找不到加密Oracle修正
- this指向_前端面试之彻底搞懂this指向
- Dubbo管理端安装