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 来获得增量的结果。但是如何在最终函数的结果变量中获得所有结果?

4

1 回答 1

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

于 2013-04-02T08:55:03.277 回答