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

資訊專欄INFORMATION COLUMN

Q.js中的幾種創(chuàng)建promise對象的方法對比

fsmStudy / 2794人閱讀

摘要:的意思是,從字面意思來看是用了的方法,繼承原有的方法類,然后又添加了自己的某些私有方法。用來實現(xiàn)代碼如下的意思是,從字面意思來看是用了的方法。

世界上最遠(yuǎn)的距離不是生與死的距離,而是文檔就在你面前,你依然不知道這個庫怎么用。

鄙人IQ不高,已經(jīng)被Q.js虐了幾天。查看了github上kriskowal/q的文檔,現(xiàn)在把幾種看明白了的使用方法整理記錄下來,以下幾種方法可以把nodejs中包含callback回調(diào)的函數(shù)轉(zhuǎn)化為promise風(fēng)格的代碼:

Q.nfcall

Q.nfapply

Q.defer

Q.denodeify

首先設(shè)定一個使用場景:預(yù)期將一個名叫foo.txt的文件讀入內(nèi)存,然后將內(nèi)容打印出來。

Q.nfcall

nfcall的意思是:Nodejs Function Call,從字面意思來看是用了javascript的call方法,繼承原有的方法(類),然后又添加了自己的某些私有方法。用Q.nfcall來實現(xiàn)代碼如下:

var fs_readfile=Q.nfcall(fs.readFile,"foo.txt","utf-8");
fs_readfile.then(readA);
function readA(data){
    console.log(data)
}
Q.nfapply

nfapply的意思是:Nodejs Function Apply,從字面意思來看是用了javascript的apply方法。與nfcall相似。用Q.nfapply來實現(xiàn)代碼如下:

var fs_readfile=Q.nfapply(fs.readFile,["foo.txt","utf-8"]);
fs_readfile.then(readA);
function readA(data){
    console.log(data)
}
Q.defer

用Q.defer來實現(xiàn)的代碼如下:

var promise=function(){
    var defer=Q.defer();
    fs.readFile("foo.txt","utf-8",defer.makeNodeResolver());
    return defer.promise;
}
function readA(data){
    console.log(data);
}
promise().then(readA);
Q.denodeify

以上三種方法,都存在一個麻煩的問題:如果我的需求場景變成了首先讀入foo.txt文件,然后根據(jù)文件中的內(nèi)容來決定是否調(diào)用另一個文件,并且打印出另一個文件的內(nèi)容。這種場景我們常常會在數(shù)據(jù)庫查找中用到——先查詢到某個id,然后在另一個庫中根據(jù)這個id查到其他某些字段的數(shù)據(jù)。這就涉及到鏈?zhǔn)秸{(diào)用。

上面的三種方法,如果在鏈?zhǔn)秸{(diào)用中我不想讓代碼變得冗余,寫一堆readB、readC……的方法(有些時候甚至究竟鏈?zhǔn)秸{(diào)用會經(jīng)歷多少步,即要使用多少個then我們事先都不清楚,需要根據(jù)獲得的數(shù)據(jù)來動態(tài)決定)。

在這種情況下,使用Q.denodeify最合適:

var fs_readfile=Q.denodeify(fs.readFile)
fs_readfile("foo.txt","utf-8")
    .then(readA).then(readA)

function readA(data){
    console.log(data);
    //只要在這里返回新的promise對象,就能把異步執(zhí)行結(jié)果返回給下一個then()方法
    return fs_readfile("foo2.txt","utf-8");
}

從上面的分析看到,我們還能想到一些實用的場景,比如:需要批量下載一批圖片(圖片數(shù)量和文件名都不確定)之后,再做批量上傳,那么只需要寫兩個不同的then方法和兩個不同的promise實例,即可用鏈?zhǔn)秸{(diào)用的方式完成任務(wù)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78333.html

相關(guān)文章

  • 異步讀取文件幾種姿勢

    摘要:臆想的針對讀取到的內(nèi)容進(jìn)行操作,比如打印文件內(nèi)容臆想中,讀取文件是有返回值的,將返回值,即文件內(nèi)容,賦給一個變量,然后決定對讀取到的內(nèi)容進(jìn)行相應(yīng)的操作,例如打印文件中的內(nèi)容。 臆想的 let fs = require(fs) function readFile(filename){ ... } let content = readFile(config.js) // 針對讀...

    chinafgj 評論0 收藏0
  • JS常用幾種異步流程控制

    摘要:雖然這個模式運行效果很不錯,但是如果嵌套了太多的回調(diào)函數(shù),就會陷入回調(diào)地獄。當(dāng)需要跟蹤多個回調(diào)函數(shù)的時候,回調(diào)函數(shù)的局限性就體現(xiàn)出來了,非常好的改進(jìn)了這些情況。 JavaScript引擎是基于單線程 (Single-threaded) 事件循環(huán)的概念構(gòu)建的,同一時刻只允許一個代碼塊在執(zhí)行,所以需要跟蹤即將運行的代碼,那些代碼被放在一個任務(wù)隊列 (job queue) 中,每當(dāng)一段代碼準(zhǔn)...

    Barry_Ng 評論0 收藏0
  • 異步請求與Fetch

    摘要:再談異步請求語言將任務(wù)的執(zhí)行模式分成兩種同步和異步。通過對象及時監(jiān)聽完成事件,執(zhí)行事件回調(diào)函數(shù)不會堵塞程序運行。新的是異步請求的另一種方案,比起其復(fù)雜糅雜的寫法,能更簡潔的獲取到數(shù)據(jù)。提供了對和以及其他與網(wǎng)絡(luò)請求有關(guān)的對象的通用定義。 再談異步請求 Javascript語言將任務(wù)的執(zhí)行模式分成兩種:同步(Synchronous)和異步(Asynchronous)。 在瀏覽器,耗時很長...

    vibiu 評論0 收藏0
  • 一名【合格】前端工程師自檢清單

    摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。 開篇 前端開發(fā)是一個非常特殊的行業(yè),它的歷史實際上不是很長,但是知識之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研...

    羅志環(huán) 評論0 收藏0
  • 一名【合格】前端工程師自檢清單

    摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。開篇 前端開發(fā)是一個非常特殊的行業(yè),它的歷史實際上不是很長,但是知識之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系...

    isaced 評論0 收藏0

發(fā)表評論

0條評論

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