摘要:上一節(jié)講述了的原理及實現(xiàn),這一節(jié)為大家?guī)韮蓚€基于封裝的庫,方便我們在項目實戰(zhàn)中能夠方便采用處理異步。的方法,也是生成一個成功的對象,但是確是將的參數(shù)傳入對象成功回調(diào)中作為成功回調(diào)參數(shù)。對象和的處理方式和調(diào)用方式相同。
上一節(jié)講述了promise的原理及實現(xiàn),這一節(jié)為大家?guī)韮蓚€基于promise封裝的庫,方便我們在項目實戰(zhàn)中能夠方便采用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方法一樣,都是等待多個異步請求結(jié)果,在做出操作
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方法,將一個同步的函數(shù),轉(zhuǎn)換為一個成功的promise對象,支持調(diào)用then方法,并且可以把同步函數(shù)的返回值,傳入then的成功回調(diào)中作為參數(shù)。
它和Promise對象的resolve方法,不太一樣。Promise的resolve方法,也是生成一個成功的promise對象,但是確是將resolve的參數(shù)傳入promise對象成功回調(diào)中作為成功回調(diào)參數(shù)。
Q.fcall(function(){return "123"}).then(res=>{console.log(res)}); Promise.resolve(function(){return "123"}).then(res=>{console.log(res)})
3.defer對象 和 promise的defer處理方式和調(diào)用方式相同。
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方法 進(jìn)行了封裝和改造,bluebird庫 主要是對promise原有功能進(jìn)行了擴(kuò)展,
主要是添加了 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 的實現(xiàn)原理,就是利用高階函數(shù)返回一個函數(shù)的特性,完成一個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)});
實現(xiàn)原理:
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的改造和升級,更加方便我們在開發(fā)過程中利用promise完成異步處理。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93761.html
摘要:經(jīng)常游蕩在的我總能發(fā)現(xiàn)許多好問題和好答案。盡管網(wǎng)絡(luò)上有著各式各樣的關(guān)于該主題的指導(dǎo),但涉及到在各種情景下的最佳實踐,或者較好實踐的方面還是不夠清晰。我寄希望于針對我這篇裹腳布式問題的回復(fù)可以改變這一現(xiàn)狀。我感覺因此收益的絕對不止是我一個人。 經(jīng)常游蕩在 SO 的我總能發(fā)現(xiàn)許多好問題和好答案。它們的好不僅僅在于知識的價值,更可貴之處在于如何表達(dá):如何提問/如何回答。不久前我在 SF...
摘要:酷庫,每天兩分鐘,了解一個流行庫。昨天我們了解了增強版庫。庫實現(xiàn)了比標(biāo)準(zhǔn)更多的方法,今天我們繼續(xù)學(xué)習(xí)另一個功能強大的工具庫。首先,和庫一樣,也是一個增強版本的庫,可以直接后替換內(nèi)置。 NPM酷庫,每天兩分鐘,了解一個流行NPM庫。 昨天我們了解了增強版Promise庫:q。q庫實現(xiàn)了比ES2015標(biāo)準(zhǔn)更多的Promise方法,今天我們繼續(xù)學(xué)習(xí)另一個功能強大的Promise工具庫:blu...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時通過http獲取一個第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個接口,可通過...
摘要:編寫代碼的開發(fā)人員必須負(fù)責(zé)代碼的生產(chǎn)部署。構(gòu)建和部署鏈需要重大更改,以便為微服務(wù)環(huán)境提供正確的關(guān)注點分離。該對象會在之后的時被這時的回調(diào)函數(shù)會被調(diào)用,并輸出。微服務(wù)部署及集成部署微服務(wù)時有一個原則一個容器中只放一個服務(wù),可以使用編 前幾天在微信群做的一次分享,整理出來分享給大家,相關(guān)代碼請戳 https://github.com/Carrotzpc/docker_web_app sho...
摘要:編寫代碼的開發(fā)人員必須負(fù)責(zé)代碼的生產(chǎn)部署。構(gòu)建和部署鏈需要重大更改,以便為微服務(wù)環(huán)境提供正確的關(guān)注點分離。該對象會在之后的時被這時的回調(diào)函數(shù)會被調(diào)用,并輸出。微服務(wù)部署及集成部署微服務(wù)時有一個原則一個容器中只放一個服務(wù),可以使用編 前幾天在微信群做的一次分享,整理出來分享給大家,相關(guān)代碼請戳 https://github.com/Carrotzpc/docker_web_app sho...
閱讀 2332·2021-11-23 09:51
閱讀 3764·2021-11-11 10:57
閱讀 1410·2021-10-09 09:43
閱讀 2498·2021-09-29 09:35
閱讀 2028·2019-08-30 15:54
閱讀 1798·2019-08-30 15:44
閱讀 3194·2019-08-30 13:20
閱讀 1703·2019-08-30 11:19