2014-04-10 17 views
2

當我使用deferred.resolve方式承諾了一個行動,我不能獲取文件的內容化妝Node.js的fs.readFile如用品質

function readFile(fileName) { 
    var deferred = Q.defer(); 
    fs.readFile(fileName, 'utf-8', deferred.resolve); 
    return deferred.promise; 
}; 

readFile('test.txt').then(function (err, data) { 
    console.log('data:' + data) 
}) 

我得到承諾的行動data:undefined輸出

但它的工作原理確定罰款時,我答應行動httpGet

var httpGet = function (opts) { 
    var deferred = Q.defer(); 
    http.get(opts, deferred.resolve); 
    return deferred.promise; 
}; 

httpGet('http://www.google.com').then(function (res) { 
     console.log("Got response: " + res.statusCode); 
     res.on('data', function (data) { 
      console.log(data.toString()); 
     }) 
    } 
); 

有什麼不對上面的代碼,並通過這種方式我怎樣才能得到文件的內容。 或者fs.readFile和http.get之間有什麼不同?

+0

相關http://stackoverflow.com/questions/22519784/how-do-i-convert-an-existing-callback-api-to-promises –

回答

3

你可以使用Q.nfcall來調用一個NodeJS函數promisified。

function httpGet(opts){ 
    return Q.nfcall(http.get,opts); 
} 

或者乾脆:

var httpGet = Q.nfbind(http.get,http) 

這爲fs.readFile順便也工作。

如果您想手動執行此操作。 Q的延遲對象有一個.makeNodeResolver功能,它可以讓你通過他們周圍安全地像你這樣的:

var httpGet = function (opts) { 
    var deferred = Q.defer(); 
    http.get(opts, deferred.makeNodeResolver()); 
    return deferred.promise; 
}; 

一個.makeNodeResolver確實是.this值綁定的東西。

儘管如此,最好使用.nfcall

+0

值得一提的是,像藍鳥這樣的其他圖書館在這裏速度要快幾個數量級因爲他們使用動態重新編譯等技術來創建(幾乎)與回調版本一樣快的promisified函數。 –

+1

'var readFile = Q.nfbind(fs.readFile,fs);' – Esailija