| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> Node.js之Promise认识 -> 正文阅读 |
|
[JavaScript知识库]Node.js之Promise认识 |
promise是node.js的对象,它是一个构造函数,作用是将异步操作以同步操作的流程表达出来。解决Node.js异步编程中回调地狱的问题。 语法: const?fs?=?require('fs'); //通过promise?能把?异步API的执行?和?正确/错误的处理?进行了分离?这样就能够解决回调地狱的问题 //resolve和reject实际上就是两个函数;如果下面异步API执行成功了就调用resolve,如果失败了就调用reject //通过resolve和reject就可以把err和result的值拿到promise的外面 let?promise?=?new?Promise((resolve,?reject)?=>?{ ????fs.readFile('./1.txt',?'utf8',?(err,?result)?=>?{ ????????if?(err?!=?null)?{ ????????????reject(err); ????????}?else?{ ????????????resolve(result); ????????} ????}); }); //then下面的回调函数相当于调用了上面的resolve()函数;把上面的result实参传递给这里回调函数的形参 //catch下面的回调函数相当于调用了上面的reject()函数;把上面的err实参传递给这里回调函数的形参 promise.then((result)?=>?{ ????????console.log(result); ????}) ????.catch((err)?=>?{ ????????console.log(err); ????}) 案例: //需求:依次读取1.txt、2.txt、3.txt三个文件 const?fs?=?require('fs'); //回调地狱代码(异步API嵌套问题) //?fs.readFile('./1.txt',?'utf8',?(err,?result1)?=>?{ //?????console.log(result1); //?????fs.readFile('./2.txt',?'utf8',?(err,?result2)?=>?{ //?????????console.log(result2); //?????????fs.readFile('./3.txt',?'utf8',?(err,?result3)?=>?{ //?????????????console.log(result3); //?????????}); //?????}); //?}); //下面是利用promise改造回调地狱的代码?解决了异步API嵌套的问题 //1.依次读取3个文件,也就是要调用三次fs.readFile(),由于fs.readFile()是异步API,所以我们可以用promise包装它 //2.为了控制API在适当的时机被执行,又在promise外面包裹一个函数?当函数被调用时return的就是这个promise对象 function?p1()?{ ????return?new?Promise((resolve,?reject)?=>?{ ????????fs.readFile('./1.txt',?'utf8',?(err,?result)?=>?{ ????????????resolve(result) ????????}) ????}) } function?p2()?{ ????return?new?Promise((resolve,?reject)?=>?{ ????????fs.readFile('./2.txt',?'utf8',?(err,?result)?=>?{ ????????????resolve(result) ????????}) ????}) } function?p3()?{ ????return?new?Promise((resolve,?reject)?=>?{ ????????fs.readFile('./3.txt',?'utf8',?(err,?result)?=>?{ ????????????resolve(result) ????????}) ????}) } //3.由于promise给我们提供了链式编程的写法,如果想要在第二个then拿到r2的结果,只需在前面一个then?返回p2()的promise对象即可 p1().then((r1)?=>?{ ????????console.log(r1); ????????return?p2(); ????}) ????.then((r2)?=>?{ ????????console.log(r2); ????????return?p3(); ????}) ????.then((r3)?=>?{ ????????console.log(r3); ????}) |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/5 22:56:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |