首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >redis命令的异步执行

redis命令的异步执行
EN

Stack Overflow用户
提问于 2013-04-01 17:50:59
回答 1查看 2.4K关注 0票数 1

我试图用下面的代码执行redis的几个异步方法

代码语言:javascript
复制
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,结果)作为最后一个元素来获得增量的结果。但是,如何在结束函数中的结果变量中得到所有的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-02 08:55:03

我想您使用的异步is模块是在:https://github.com/fjakobs/async.js中记录的。

在您的代码中:

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

您得到了"TypeError: Object true没有方法'apply'“错误,因为您构建的列表不是回调列表。这是一个价值列表。

下面是一些您想要做的代码:

代码语言:javascript
复制
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()代替调用(),使用toArray()代替end()。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15748616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档