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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值