Redis命令的异步执行(Async execution of redis commands)

2019-10-17 22:49发布

我想执行的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,它可能解释,作为真实的,但我不明白为什么它使用的方法适用于它?

我可以通过添加功能(ERR,结果)client.hincrby作为最后一个元素..得到增量的结果,但我如何得到的结果变量的所有结果到底功能?

Answer 1:

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

在您的代码:

  • 名单()是发电机。 它允许阵列由asyncjs迭代。 该数组是值的阵列。
  • ()调用是调用每一个项目一个映射。 因此,该项目具有可以被调用(即他们必须回调)。
  • 端()是一个终止终点,当迭代结束调用。 作为一个参数,你只能得到序列(不是整个序列)的最后一个值。

你得到了“[类型错误:对象真实没有方法‘应用’]”的错误,因为你已经建立的名单是不是回调的列表。 这是值的列表。

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

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

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



文章来源: Async execution of redis commands