我正在尝试使用以下代码执行redis的几个异步方法
var redis = require("redis");
var client = redis.createClient();
var async = require("asyncjs");
async.list([
client.hincrby("traffic:" + siteId, 'x', 1),
client.hincrby("traffic:" + siteId, 'y', 1),
client.hincrby("traffic:" + siteId, 'z', 1)
]).call().end(function(err, result)
{
console.log(err); // returns error [TypeError: Object true has no method 'apply']
console.log(result); // undefined
if(err) return false;
return result;
});
所有方法都成功执行
但我收到错误[TypeError: Object true has no method 'apply']
该方法被执行并返回true,并且它可能将其解释为true,但我不明白为什么它必须使用方法apply on it?
我可以通过向client.hincrby添加函数(错误,结果)作为最后一个元素来获得增量的结果..但是如何在结束函数中获得结果变量中的所有结果?
答案 0 :(得分:1)
我认为您使用的asyncjs模块是在以下文档中记录的模块: https://github.com/fjakobs/async.js
在您的代码中:
你得到了“ [TypeError:Object true has no method'apply'] ”错误,因为你构建的列表不是回调列表。这是一个值列表。
以下是一些应该做你想做的代码:
var redis = require("redis");
var client = redis.createClient();
var async = require("asyncjs");
function main() {
var siteId = 1;
async
.list(['x','y','z'])
.map( function (item,next) {
client.hincrby('traffic:' + siteId, item, 1, function (err,res) {
next(err,res)
})
})
.toArray( function(err,res) {
console.log(err);
console.log(res);
});
}
main()
请注意,我们使用map()而不是call(),而使用toArray()而不是end()。