摘要:上一節講述了的原理及實現,這一節為大家帶來兩個基于封裝的庫,方便我們在項目實戰中能夠方便采用處理異步。的方法,也是生成一個成功的對象,但是確是將的參數傳入對象成功回調中作為成功回調參數。對象和的處理方式和調用方式相同。
上一節講述了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完成異步處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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...
閱讀 2319·2021-11-23 09:51
閱讀 3752·2021-11-11 10:57
閱讀 1400·2021-10-09 09:43
閱讀 2489·2021-09-29 09:35
閱讀 2019·2019-08-30 15:54
閱讀 1792·2019-08-30 15:44
閱讀 3185·2019-08-30 13:20
閱讀 1694·2019-08-30 11:19