成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于promise對象的兩種類庫q庫和bluebird基礎(chǔ)調(diào)用和原理

Travis / 1826人閱讀

摘要:上一節(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

相關(guān)文章

  • Koa / Co / Bluebird or Q / Generators / Promises /

    摘要:經(jīng)常游蕩在的我總能發(fā)現(xiàn)許多好問題和好答案。盡管網(wǎng)絡(luò)上有著各式各樣的關(guān)于該主題的指導(dǎo),但涉及到在各種情景下的最佳實踐,或者較好實踐的方面還是不夠清晰。我寄希望于針對我這篇裹腳布式問題的回復(fù)可以改變這一現(xiàn)狀。我感覺因此收益的絕對不止是我一個人。 經(jīng)常游蕩在 SO 的我總能發(fā)現(xiàn)許多好問題和好答案。它們的好不僅僅在于知識的價值,更可貴之處在于如何表達(dá):如何提問/如何回答。不久前我在 SF...

    xingpingz 評論0 收藏0
  • NPM酷bluebird Promise工具

    摘要:酷庫,每天兩分鐘,了解一個流行庫。昨天我們了解了增強版庫。庫實現(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...

    itvincent 評論0 收藏0
  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時通過http獲取一個第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個接口,可通過...

    tuniutech 評論0 收藏0
  • 高質(zhì)量 Node.js 微服務(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...

    szysky 評論0 收藏0
  • 高質(zhì)量 Node.js 微服務(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...

    Michael_Ding 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<