异步执行Redis命令
我正在尝试使用以下代码执行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,但是我不明白为什么它必须使用该方法应用于它?
我可以通过将一个函数(err,结果)作为最后一个元素添加到client.hincrby中来获得增量的结果。但是,如何在end函数的result变量中获得所有结果呢?
回答:
我想您使用的asyncjs模块是在以下位置记录的模块:https :
//github.com/fjakobs/async.js
在您的代码中:
- list()是一个生成器。它允许数组由asyncjs进行迭代。该数组是值的数组。
- call()是一个 每个项目的映射器。因此,这些项必须是可调用的(即,它们必须是回调)。
- end()是终止终点,当迭代结束时调用。作为参数,您只能获取序列的最后一个值(而不是整个序列)。
您收到“ [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()。
以上是 异步执行Redis命令 的全部内容, 来源链接: utcz.com/qa/422365.html