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