当前位置: 首页 > 面试题库 >

异步执行Redis命令

徐德海
2023-03-14
问题内容

我正在尝试使用以下代码执行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,但是我不明白为什么它必须使用该方法应用于它?

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


问题答案:

我想您使用的asyncjs模块是在以下位置记录的模块:https :
//github.com/fjakobs/async.js

在您的代码中:

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

您收到“ [TypeError:Object true没有方法’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()。



 类似资料:
  • 异步注解@Async,默认情况下是不生效的,需要的话可以启用. 该加载器有一个可选参数,线程池大小,默认是32,详情可以查阅org.nutz.aop.interceptor.async.AsyncAopIocLoader @IocBy( args={"*json","ioc/", "*anno","net.wendal.nutzbook", "*a

  • Node 库以多种方式处理异步功能。最常见的模式是 error-first callbacks,但是你还可能会遇到 streams、promises、event emitters、child processes, 或 observables。gulp 任务(task)规范化了所有这些类型的异步功能。 任务(task)完成通知 当从任务(task)中返回 stream、promise、event e

  • 本文向大家介绍redis执行redis命令的方法教程,包括了redis执行redis命令的方法教程的使用技巧和注意事项,需要的朋友参考一下 Redis 命令 Redis 命令用于在 redis 服务上执行操作。所以我们必须要启动Redis服务程序,也就是redis安装目录下的redis-server.exe,你可以双击执行,也可以打开cmd窗口,将路径定位到Redis安装目录下,通过redis-s

  • 问题内容: 我有一个需要使用redis命令行界面执行的redis命令的长文本文件: 例如 等等 我似乎找不到一种比一次输入命令更快的方法。有数十万行,所以我不想只将它们全部堆叠到一个DEL命令中,它们也不需要一次全部运行。 问题答案: 以下代码对我在Mac上的Redis 2.4.7有用 满足您的要求吗?或者,您是否正在寻找是否有办法以编程方式更快地做到这一点?

  • 这是在一次Android采访中被问到的。有人问我是否可以从异步任务 1 的 doInBackground() 方法(让它成为 Task1)启动另一个异步任务(让它成为 Task2)。我浏览了文档,其中说了以下内容: 必须在UI线程上创建任务实例。 必须在 UI 线程上调用 execute(Params...)。 根据这些陈述,我认为从另一个任务的后台方法启动一个任务是不可能的。此外,async任务