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

原创 2016年06月13日 22:22:29

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


相关文章推荐

nodejs q模块

nodejs module q q模块 promise q模块的安装 promise的使用 then 函数 流式操作 组合操作 Promise的创建 Using Qfcall Using Defer...

NodeJS的Q入门指导(一)

为什么要写Q的入门指导?

node.js sql 注入攻击防御方法 (sql Injection)

sql 注入的原理和方法应该都知道了,这里记录一下node-mysql提供的现成的api https://github.com/felixge/node-mysql node-mysql 提供了...

NodeJS Multiple Callback解决之使用Q Promises

在上一篇《Javascript Promises模式——相当酷的Callback Hell终结者》我们介绍了Javascript的Promise模式,接着我们就把Javascript Promise用...
  • gmszone
  • gmszone
  • 2014年11月27日 23:33
  • 2155

Kraken项目中如何巧用Q.allSettled装饰nodejs代码的门面

若你是以krakenjs作为编写nodejs项目的框架, 这里简单介绍下models的概念。 Kraken将datamodels从controller逻辑中分离出来,从而能有cleaner更有条理的...
  • chndata
  • chndata
  • 2015年12月22日 15:33
  • 1167

nodejs promise for q.js

摘要: q.js在nodejs里是一个非常流行的promise库,支持浏览器端使用,详情请点击这里 q.js跟async要解决的问题差不多,都是解决回调函数的嵌套问题,避免嵌套层级太深导致一系列...

nodejs 的q模块

同时向前端返回多个接口参数直接上代码var Q = require('q');//返回规格function getGuige() { var deferred = Q.defer() ; DB....

Q信令和PRI、DSS1、PRA的关系与区别?

PRI信令:又称ISDN(30B+D)信令、DSS1信令、PRA信令。在北美和日本,ISDN PRI提供23B+D信道,总速率达1.544Mbps, 其中D信道速率为64kbps。而在欧洲、澳大利亚...

strong与em、q、cite、blockquote区别

作用相似html标记:strong与em、q、cite、blockquote,在XHTML标签中有一些标签的作用是相似的,当然这里的相似是指语义相似,以至于很多人都不清楚这些相似的标签如何使用,那么今...

C++中int *p[4]和 int (*q)[4]的区别

这俩兄弟长得实在太像,以至于经常让人混淆。然而细心领会和甄别就会发现它们大有不同。 前者是指针数组,后者是指向数组的指针。更详细地说。 前: 指针数组;是一个元素全为指针的数组. 后: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nodejs q中q()与q.invoke()区别
举报原因:
原因补充:

(最多只允许输入30个字)