异步执行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

回到顶部