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


Node.js中, 使用Q.ninvoke封装对象方法为promise

var Q = require('q');function _o(msg){console.log(msg);}function main(){ var obj1 = { var1: 1,...
  • lslxdx
  • lslxdx
  • 2016年06月15日 11:52
  • 649

NodeJS的Q入门指导(一)

为什么要写Q的入门指导?
  • boyzhoulin
  • boyzhoulin
  • 2014年10月29日 21:04
  • 2828

native invoke js和js invoke native

没有更深的认识了,只能说点浅的东西
  • mzxysxx
  • mzxysxx
  • 2016年07月21日 12:07
  • 820

NodeJS的Q入门指导(一)

为什么要写Q的入门指导?
  • boyzhoulin
  • boyzhoulin
  • 2014年10月29日 21:04
  • 2828

AngularJS中的$http、$q服务和promise对象的联系

一、介绍:$http服务是AngularJS系统自带的,可以用来进行网络通信、获取远程服务器的数据。要记住的是,$http是对浏览器XMLHttpRequest的封装,也就是说,它其实是Ajax。首先...
  • VitaLemon__
  • VitaLemon__
  • 2016年08月09日 15:41
  • 5662

SPSS PP图和QQ图

P-P图和Q-Q图都是用来观察变量是否服从正太分布的。 选择菜单中的分析-描述统计-P-P图,则如下图 1变量选项栏:选择绘制pp图的变量,可多选 2检验分布选项栏:用于检测待检验分布的类型,如be...
  • myl1992
  • myl1992
  • 2015年05月13日 08:58
  • 4232

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

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

NodeJS Multiple Callback解决之使用Q Promises

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

nodejs promise for q.js

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

nodejs q模块

nodejs module q q模块 promise q模块的安装 promise的使用 then 函数 流式操作 组合操作 Promise的创建 Using Qfcall Using Defer...
  • ii1245712564
  • ii1245712564
  • 2016年05月15日 22:10
  • 10377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nodejs q中q()与q.invoke()区别
举报原因:
原因补充:

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