摘要:上一节讲述了的原理及实现,这一节为大家带来两个基于封装的库,方便我们在项目实战中能够方便采用处理异步。的方法,也是生成一个成功的对象,但是确是将的参数传入对象成功回调中作为成功回调参数。对象和的处理方式和调用方式相同。
上一节讲述了promise的原理及实现,这一节为大家带来两个基于promise封装的库,方便我们在项目实战中能够方便采用promise处理异步。
一、q库 www.nodejs.com/pageage/q
安装: npm install q --save
let Q = require("q"); let p = new Promise(function(resolve,reject){ resolve("hello,promise") })
1.Q的all方法 和Promise.all方法一样,都是等待多个异步请求结果,在做出操作
Q.all([p,p,p]).then(([a,b,c])=>{console.log(a,b,c)}); Promise.all([p,p,p]).then(([a,b,c])=>{console.log(a,b,c)})
2.Q的fcall方法,将一个同步的函数,转换为一个成功的promise对象,支持调用then方法,并且可以把同步函数的返回值,传入then的成功回调中作为参数。
它和Promise对象的resolve方法,不太一样。Promise的resolve方法,也是生成一个成功的promise对象,但是确是将resolve的参数传入promise对象成功回调中作为成功回调参数。
Q.fcall(function(){return "123"}).then(res=>{console.log(res)}); Promise.resolve(function(){return "123"}).then(res=>{console.log(res)})
3.defer对象 和 promise的defer处理方式和调用方式相同。
let fs = require("fs"); function readFile(path){ let defer = Q.defer(); fs.readFile(path,"utf8",function(err,data){ err?defer.reject(err): defer.resolve(data); }) return defer.promise; } readFile("./1.txt").then(res=>{console.log(res)});
二、bluebird
上面q库 主要是对原有promise方法 进行了封装和改造,bluebird库 主要是对promise原有功能进行了扩展,
主要是添加了 promisify和promisifyAll两个方法,可以将异步方法promise化。
安装 npm intall bluebird --save
1、promisify 将一个异步方法promise化
let blueBird = require("bluebird"); let read = blueBird.promisify(fs.readFile); read("./2.txt","utf8").then(res=>{console.log(res)});
promisify 的实现原理,就是利用高阶函数返回一个函数的特性,完成一个promise实例的封装
function myPrimisify (fn){ return function (...args){ return new Promise(function(resolve,reject){ fn(...args,function(err,data){ err?reject(err):resolve(data) }) }) } } let read2 = myPrimisify(fs.readFile); read2("./2.txt","utf8").then(res=>{console.log(res)});
2.promisifyAll 将一个对象上面所有的方法,都promise化,生成一个属性名为‘原有方法’+‘Async’的方法,都可以支持异步方法.
blueBird.promisifyAll(fs); fs.readFileAsync("./2.txt","utf8").then(res=>{console.log(res)});
实现原理:
function myPromisifyAll(obj){ Object.keys(obj).forEach((item,index)=>{ if(typeof obj[item]=="function") obj[item+"Async"] =myPrimisify(obj[item]) }) } myPromisifyAll(fs); fs.readFileAsync("./2.txt","utf8").then(res=>{console.log(res)});
这里介绍了q库和bluebird库对原有primise的改造和升级,更加方便我们在开发过程中利用promise完成异步处理。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/93761.html
摘要:经常游荡在的我总能发现许多好问题和好答案。尽管网络上有着各式各样的关于该主题的指导,但涉及到在各种情景下的最佳实践,或者较好实践的方面还是不够清晰。我寄希望于针对我这篇裹脚布式问题的回复可以改变这一现状。我感觉因此收益的绝对不止是我一个人。 经常游荡在 SO 的我总能发现许多好问题和好答案。它们的好不仅仅在于知识的价值,更可贵之处在于如何表达:如何提问/如何回答。不久前我在 SF...
摘要:酷库,每天两分钟,了解一个流行库。昨天我们了解了增强版库。库实现了比标准更多的方法,今天我们继续学习另一个功能强大的工具库。首先,和库一样,也是一个增强版本的库,可以直接后替换内置。 NPM酷库,每天两分钟,了解一个流行NPM库。 昨天我们了解了增强版Promise库:q。q库实现了比ES2015标准更多的Promise方法,今天我们继续学习另一个功能强大的Promise工具库:blu...
摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。写一个符合规范并可配合使用的写一个符合规范并可配合使用的理解的工作原理采用回调函数来处理异步编程。 JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过...
摘要:编写代码的开发人员必须负责代码的生产部署。构建和部署链需要重大更改,以便为微服务环境提供正确的关注点分离。该对象会在之后的时被这时的回调函数会被调用,并输出。微服务部署及集成部署微服务时有一个原则一个容器中只放一个服务,可以使用编 前几天在微信群做的一次分享,整理出来分享给大家,相关代码请戳 https://github.com/Carrotzpc/docker_web_app sho...
摘要:编写代码的开发人员必须负责代码的生产部署。构建和部署链需要重大更改,以便为微服务环境提供正确的关注点分离。该对象会在之后的时被这时的回调函数会被调用,并输出。微服务部署及集成部署微服务时有一个原则一个容器中只放一个服务,可以使用编 前几天在微信群做的一次分享,整理出来分享给大家,相关代码请戳 https://github.com/Carrotzpc/docker_web_app sho...
阅读 2311·2021-11-23 09:51
阅读 3748·2021-11-11 10:57
阅读 1391·2021-10-09 09:43
阅读 2481·2021-09-29 09:35
阅读 2013·2019-08-30 15:54
阅读 1788·2019-08-30 15:44
阅读 3179·2019-08-30 13:20
阅读 1687·2019-08-30 11:19