我正在尝试使用以下代码执行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']
[TypeError: Object true has no method 'apply']
该方法被执行并返回true,它可能将其解释为true,但是我不明白为什么它必须使用该方法应用于它?
我可以通过将一个函数(err,结果)作为最后一个元素添加到client.hincrby中来获得增量的结果。但是,如何在end函数的result变量中获得所有结果呢?
我想您使用的asyncjs模块是在以下位置记录的模块:https : //github.com/fjakobs/async.js
在您的代码中:
您收到“ [TypeError:Object true没有方法’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()。