异步执行redis命令

时间:2013-04-01 17:50:59

标签: 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),
        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添加函数(错误,结果)作为最后一个元素来获得增量的结果..但是如何在结束函数中获得结果变量中的所有结果?

1 个答案:

答案 0 :(得分:1)

我认为您使用的asyncjs模块是在以下文档中记录的模块: https://github.com/fjakobs/async.js

在您的代码中:

  • list()是一个生成器。它允许数组由asyncjs迭代。数组是一个值数组。
  • call()是一个映射器,调用每个项目。因此,这些项目是可调用的(即它们必须是回调)。
  • end()是终止结束点,在迭代结束时调用。作为参数,您只能获得序列的最后一个值(而不是整个序列)。

你得到了“ [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()。