在nodejs的異步調用中,大量的回調會增加代碼維護難度,破壞代碼的可讀性,因此引入promise概念來避免這種情況的發生。我一般使用q(https://github.com/kriskowal/q)來進行。
在q中,常見此類用法q()和q.invoke(),剛接觸q時,我會這兩個用法沒搞懂,代碼中看到經常一頭霧水。經過閱讀文檔和代碼實驗,現基本有了一些概念,記錄於此,方便自己查閱。
q(obj),q()創建了一個promise對象,可在其後接.then來進行鏈式調用,其參數obj將作爲該promise的resolve對象,傳遞給then中的函數作爲參數。例如,
q(1).then(function(v) {
console.log(v); //1
})
q.invoke(),按照文檔,其用法爲
q.invoke(methodName, ...args)
包裝了函數methodName,使其返回一個promise,args爲傳入函數methodName的參數。q.invoke()將函數methodName放入promise的鏈中,等到調用時去執行。
如果這樣使用q(methodName),那麼傳遞給then的參數將會是一個[Function] obj,而不是methodName異步執行後的返回值。可見,q()只是將其參數作爲resolve的值傳遞到promise鏈中,q.invoke()則是將參數中的函數掛載到promise鏈中。
從下面的例子中可以看出兩者的區別
'use strict';
var nCrypto = require('crypto');
var q = require('q');
function digest(url) {
var sha256 = nCrypto.createHash('sha256');
sha256.update(url);
return q((function() {
return sha256.digest('hex');
} ()));
}
var url = 'www.baidu.com';
digest(url).then(function (v) {
console.log(v);
});
q.invoke()
'use strict';
var nCrypto = require('crypto');
var q = require('q');
function digest(url) {
var sha256 = nCrypto.createHash('sha256');
sha256.update(url);
return q.invoke(function() {
return sha256.digest('hex');
});
}
var url = 'www.baidu.com';
digest(url).then(function (v) {
console.log(v);
});