Javascript redis命令的异步执行

Javascript redis命令的异步执行,javascript,asynchronous,redis,Javascript,Asynchronous,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),

我试图用以下代码执行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;
    });
所有方法都成功执行

但是我得到了错误
[类型错误:Object true没有方法'apply']

该方法被执行并返回true,它可能会将其解释为true,但我不明白为什么它必须对其应用该方法


我可以通过向client.hincrby添加一个函数(err,result)作为最后一个元素来获得增量的结果。。但是如何在end函数的result变量中获得所有结果呢?

我想您使用的asyncjs模块就是记录在以下位置的模块:

在代码中:

  • 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()。

我想您使用的asyncjs模块就是记录在以下位置的模块:

在代码中:

  • 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()。

有人重新定义了console对象吗?我不明白你的意思?我不知道关于
redis
,但我看到过有人重新定义console(特别是console.log)以提供不同功能的示例代码。可能在这里发生了这种情况,并且您的console.log(本地)实现需要一个具有“apply”方法的输入对象?嗯,不,这不应该是问题所在。。我并没有凌驾于我所知道的任何事情之上。。我认为它必须使用“end”函数做一些事情,因为所有操作都会成功执行。。谢谢你!有没有什么东西重新定义了console对象?我不明白你的意思?我不知道任何关于
redis
,但我看到过一些示例代码,其中有人重新定义console(&特别是console.log)以提供不同的功能。可能在这里发生了这种情况,并且您的console.log(本地)实现需要一个具有“apply”方法的输入对象?嗯,不,这不应该是问题所在。。我并没有凌驾于我所知道的任何事情之上。。我认为它必须使用“end”函数做一些事情,因为所有操作都会成功执行。。谢谢你!是的,这很有效!我已经用一些额外的代码修复了它,但这就是我要搜索的。谢谢是的,这很有效!我已经用一些额外的代码修复了它,但这就是我要搜索的。谢谢