2013-04-01 161 views
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; 
    }); 

所有方法执行成功

,但我得到的错误[TypeError: Object true has no method 'apply']

该方法执行并返回true,并且它可能解释为true,但我不明白为什么它必须使用方法适用于它?

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

+0

是否有任何东西重新定义了控制台对象? –

+0

我不明白你的意思? –

+0

我对'redis'一无所知,但我曾经看过示例代码,其中有人重新定义了控制台(尤其是console.log)以提供不同的功能。也许这发生在这里,你的(本地)console.log实现期望有一个'apply'方法的输入对象? –

回答

1

我想你使用asyncjs模块是一个在记载: https://github.com/fjakobs/async.js

在您的代码:

  • 名单()是发电机。它允许数组由asyncjs迭代。该数组是一组值。
  • call()是一个映射器,其中每个项目称为。这些项目因此可以被调用(即它们必须是回调)。
  • end()是终止结束点,当迭代结束时调用。作为参数,您只能获得序列的最后一个值(而不是整个序列)。

你拿到“[类型错误:对象真正有没有方法‘申请’]”错误,因为你已经建立的名单是不是回调的列表。这是一个值列表。

下面是一些代码,应该做你想要什么:

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

请注意,这里我们使用的地图(),而不是()调用,并指定者(),而不是结束()。

+0

是的这有效!我已经用一些额外的代码修复了它,但这正是我正在寻找的。谢谢! –