关闭

nodejs q中q()与q.invoke()区别

标签: nodejspromiseq
761人阅读 评论(0) 收藏 举报
分类:

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:70994次
    • 积分:1014
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:3篇
    • 译文:0篇
    • 评论:9条
    最新评论