详细了解Nodejs中的Promise对象
跟大家讲解下有关详细了解Nodejs中的Promise对象,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说详细了解Nodejs中的Promise对象,小编也收集到了有关详细了解Nodejs中的Promise对象的相关资料,希望大家看到了会喜欢。
本篇文章带大家了解一下Nodejs中的Promise对象。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。相关推荐:《nodejs 教程》
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对象的详细内容,更多请关注php中文网其它相关文章!
来源:php中文网
免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!
-
作为A股市场中极具代表性的黄金珠宝行业龙头企业,作为中国历史最悠久的珠宝品牌之一,老凤祥(股票代码:600612)...浏览全文>>
-
宝子们,杭州 房子装修完成啦!这次要给大家分享几家设计超赞的装修公司哦。它们各具特色,从空间规划到风格...浏览全文>>
-
欲筑室者,先治其基。在上海,装修房子对于每个业主而言,都是极为关键的一步,然而,如何挑选一家值得信赖的...浏览全文>>
-
2025年以来,联通支付严格贯彻落实国家战略部署,以数字和科技为驱动,做好金融五篇大文章,履行支付为民社会...浏览全文>>
-
良工巧匠,方能筑就华居;精雕细琢,方可打造美家。当我们谈论装修公司时,选择一家靠谱可靠的公司是至关重要...浏览全文>>
-
在当今社会,随着城市化进程的高速推进,建筑垃圾的产生量与日俱增。据权威数据显示,我国每年建筑垃圾产生量超 ...浏览全文>>
-
家人们,在上海要装修,选对公司那可太重要了!古语有云:"安得广厦千万间,大庇天下寒士俱欢颜。"一个温馨的...浏览全文>>
-
近年来,新能源汽车市场发展迅猛,各大品牌纷纷推出各具特色的车型以满足消费者多样化的需求。作为国内新能源...浏览全文>>
-
近年来,随着汽车市场的不断变化和消费者需求的升级,安徽滁州地区的宝来2025新款车型在市场上引起了广泛关注...浏览全文>>
-
随着汽车市场的不断变化,滁州地区的消费者对高尔夫车型的关注度持续上升。作为大众品牌旗下的经典车型,高尔...浏览全文>>
- 安徽滁州途安L新车报价2022款,最低售价16.68万起,入手正当时
- 小鹏G7试驾,新手必知的详细步骤
- 别克GL8预约试驾,4S店的贴心服务与流程
- 安徽阜阳ID.4 CROZZ落地价全解,买车必看的省钱秘籍
- 淮北探岳多少钱 2025款落地价,最低售价17.69万起现在该入手吗?
- 安徽淮南大众CC新款价格2025款多少钱能落地?
- 淮北长安启源C798价格,最低售价12.98万起现在该入手吗?
- 安徽淮南途锐价格,各配置车型售价全解析
- 蒙迪欧试驾预约,4S店体验全攻略
- 沃尔沃XC40试驾需要注意什么
- 滁州ID.4 X新车报价2025款,各车型售价大公开,性价比爆棚
- 试驾思域,快速操作,轻松体验驾驶乐趣
- 试驾长安CS35PLUS,一键搞定,开启豪华驾驶之旅
- 天津滨海ID.6 X落地价限时特惠,最低售价25.9888万起,错过不再有
- 天津滨海凌渡多少钱?看完这篇购车攻略再做决定
- 安徽池州长安猎手K50落地价,买车前的全方位指南
- 山东济南ID.6 CROZZ 2024新款价格,最低售价19.59万起,现车充足
- 试驾海狮05EV,新手必知的详细步骤
- 生活家PHEV多少钱 2025款落地价走势,近一个月最低售价63.98万起,性价比凸显
- 奇瑞风云A9试驾,新手必知的详细步骤