nodejs q中q()與q.invoke()區別

在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);
});


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章