摘要:的意思是,從字面意思來看是用了的方法,繼承原有的方法類,然后又添加了自己的某些私有方法。用來實現代碼如下的意思是,從字面意思來看是用了的方法。
世界上最遠的距離不是生與死的距離,而是文檔就在你面前,你依然不知道這個庫怎么用。
鄙人IQ不高,已經被Q.js虐了幾天。查看了github上kriskowal/q的文檔,現在把幾種看明白了的使用方法整理記錄下來,以下幾種方法可以把nodejs中包含callback回調的函數轉化為promise風格的代碼:
Q.nfcall
Q.nfapply
Q.defer
Q.denodeify
首先設定一個使用場景:預期將一個名叫foo.txt的文件讀入內存,然后將內容打印出來。
Q.nfcallnfcall的意思是:Nodejs Function Call,從字面意思來看是用了javascript的call方法,繼承原有的方法(類),然后又添加了自己的某些私有方法。用Q.nfcall來實現代碼如下:
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來實現代碼如下:
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來實現的代碼如下:
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文件,然后根據文件中的內容來決定是否調用另一個文件,并且打印出另一個文件的內容。這種場景我們常常會在數據庫查找中用到——先查詢到某個id,然后在另一個庫中根據這個id查到其他某些字段的數據。這就涉及到鏈式調用。
上面的三種方法,如果在鏈式調用中我不想讓代碼變得冗余,寫一堆readB、readC……的方法(有些時候甚至究竟鏈式調用會經歷多少步,即要使用多少個then我們事先都不清楚,需要根據獲得的數據來動態決定)。
在這種情況下,使用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對象,就能把異步執行結果返回給下一個then()方法 return fs_readfile("foo2.txt","utf-8"); }
從上面的分析看到,我們還能想到一些實用的場景,比如:需要批量下載一批圖片(圖片數量和文件名都不確定)之后,再做批量上傳,那么只需要寫兩個不同的then方法和兩個不同的promise實例,即可用鏈式調用的方式完成任務。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78333.html
摘要:臆想的針對讀取到的內容進行操作,比如打印文件內容臆想中,讀取文件是有返回值的,將返回值,即文件內容,賦給一個變量,然后決定對讀取到的內容進行相應的操作,例如打印文件中的內容。 臆想的 let fs = require(fs) function readFile(filename){ ... } let content = readFile(config.js) // 針對讀...
摘要:雖然這個模式運行效果很不錯,但是如果嵌套了太多的回調函數,就會陷入回調地獄。當需要跟蹤多個回調函數的時候,回調函數的局限性就體現出來了,非常好的改進了這些情況。 JavaScript引擎是基于單線程 (Single-threaded) 事件循環的概念構建的,同一時刻只允許一個代碼塊在執行,所以需要跟蹤即將運行的代碼,那些代碼被放在一個任務隊列 (job queue) 中,每當一段代碼準...
摘要:再談異步請求語言將任務的執行模式分成兩種同步和異步。通過對象及時監聽完成事件,執行事件回調函數不會堵塞程序運行。新的是異步請求的另一種方案,比起其復雜糅雜的寫法,能更簡潔的獲取到數據。提供了對和以及其他與網絡請求有關的對象的通用定義。 再談異步請求 Javascript語言將任務的執行模式分成兩種:同步(Synchronous)和異步(Asynchronous)。 在瀏覽器,耗時很長...
摘要:在他的重學前端課程中提到到現在為止,前端工程師已經成為研發體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。 開篇 前端開發是一個非常特殊的行業,它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現在為止,前端工程師已經成為研...
摘要:在他的重學前端課程中提到到現在為止,前端工程師已經成為研發體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。開篇 前端開發是一個非常特殊的行業,它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現在為止,前端工程師已經成為研發體系...
閱讀 3323·2021-11-25 09:43
閱讀 3008·2021-10-15 09:43
閱讀 1965·2021-09-08 09:36
閱讀 2918·2019-08-30 15:56
閱讀 742·2019-08-30 15:54
閱讀 2684·2019-08-30 15:54
閱讀 2973·2019-08-30 11:26
閱讀 1237·2019-08-29 17:27