搜索
首页数据库mysql教程在异步回调中操作redis的一个异常
在异步回调中操作redis的一个异常Jun 07, 2016 pm 04:38 PM
redis使用回调异常异步操作昨天

昨天在使用node redis的时候报了这样一个错: TypeError: Object [object Object] has no method 'send_command' at RedisClient.(anonymous function) (D:\index.js:991:25) at null._onTimeout (D:\index.js:17:22) at Timer.listOnTimeout [as ontimeout]

昨天在使用node redis的时候报了这样一个错:

TypeError: Object [object Object] has no method 'send_command'
    at RedisClient.(anonymous function) (D:\index.js:991:25)
    at null._onTimeout (D:\index.js:17:22)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

这个bug比较隐蔽,一步一步来看:

起因

我要实现的是批量插入redis的列表(list),相关的api是这样的:client.rpush(key, [value1, value2, ..., callback]) ,参数必须一个一个列出来,要想批量添加(数组),只能使用apply 方法了:

var array = ['list', '1', '2', '3', '4',
    function() {
        console.log('success');
    }
];
client.rpush.apply(this, array);

数组的第一参数是key,最后一个是回调函数,之间全部是要添加的数据。构造这样一个数组,使用apply 就很完美的解决了批量添加的问题。但是还是太年轻啊,执行demo的时候很正常,但是放入正式代码中就有问题了。

解决

正式代码的数据一般是异步得到的,用setTimeout 模拟一下:

var redis = require('redis'),
    client = redis.createClient(6379, '127.0.0.1', {
        auth_pass: 'home.local.17173.com'
    });
client.on('error', function(err) {
    console.log('redis错误:' + err);
});
client.on('connect', function() {
    setTimeout(function() {
        var array = ['list', '1', '2', '3', '4',
            function() {
                console.log('success');
            }
        ];
        client.rpush.apply(this, array);
    }, 1000);
});

执行上面的代码会报出文章开头的错误,提示“Object [object Object] has no method ‘send_command’”,联系到apply 的this,问题可能出在作用域上,修改倒数第三行代码:

client.rpush.apply(client, array);

执行后就ok了:

所以问题就是出在作用域上,apply 这样的比较明显,但是使用async等就不是那么明显了。在stackoverflow上找到一个问题,有bug的代码是这样的:

var async = require('async');
var redis = require('redis');
var keys = ['key1', 'key2', 'key3'];
var client = redis.createClient();
var multi = client.multi();
for (var key in keys) {
  multi.hmset(key, {'some': 'value'});
}
multi.exec(function(err, res) {
  if (err) throw err;
  console.dir(res);
  var myCallback = function(err, res) {
    console.log('in myCallback');
    console.dir(res);
    client.quit();
    process.exit();
  };
 async.concat(keys, client.hgetall, myCallback);
});

错误还是和文章开头的一样,解决方法是使用bind 函数。修改倒数第二行代码如下:

async.concat(keys, client.hgetall.bind(client), myCallback);

bind函数可以用来设置this 参数,具体用法看这里。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
快速应用:PHP 异步 HTTP 下载多个文件的实用开发案例分析快速应用:PHP 异步 HTTP 下载多个文件的实用开发案例分析Sep 12, 2023 pm 01:15 PM

快速应用:PHP异步HTTP下载多个文件的实用开发案例分析随着互联网的发展,文件下载功能已成为很多网站和应用程序的基本需求之一。而对于需要同时下载多个文件的场景,传统的同步下载方式往往效率低下且耗费时间。为此,使用PHP异步HTTP下载多个文件成为了一种越来越常见的解决方案。本文将通过一个实际的开发案例,详细分析如何使用PHP异步HTTP

Swoole如何支持异步SMTP操作Swoole如何支持异步SMTP操作Jun 25, 2023 pm 12:24 PM

随着互联网的不断发展和普及,电子邮件已经成为了人们生活和工作中必不可少的一部分,而SMTP(SimpleMailTransferProtocol,简单邮件传输协议)则是邮件发送的重要协议之一。Swoole作为PHP的一个异步网络通讯框架,可以很好地支持异步SMTP操作,使邮件发送更加高效和稳定。本文将介绍Swoole如何支持异步SMTP操作,包括使用步

Vue文档中的异步请求函数的使用方法Vue文档中的异步请求函数的使用方法Jun 20, 2023 pm 05:55 PM

Vue.js是一种流行的前端JavaScript框架,它提供了一种在应用程序中构建用户界面的方式。在Vue.js的文档中,我们可以找到很多有用的信息,特别是关于如何使用异步请求函数。异步请求函数是一种在应用程序中执行异步任务的方式。它们被用于从服务器获取数据、处理输入、验证表单等。一般情况下,异步请求函数需要与Promise、async和await等Java

Swoole如何支持异步AMQP操作Swoole如何支持异步AMQP操作Jun 25, 2023 am 08:22 AM

随着互联网业务量的不断增长,对于高并发和高性能的需求越来越高,而Swoole作为PHP的一款网络通信框架,也越来越受到开发者的青睐。其中,Swoole支持异步AMQP是比较常见的应用场景之一。那么我们来看看Swoole如何支持异步AMQP操作。首先,我们需要明确什么是AMQP。AMQP(AdvancedMessageQueuingProtocol)高级

Swoole如何支持异步SSH操作Swoole如何支持异步SSH操作Jun 25, 2023 am 11:10 AM

Swoole是一个为高并发而设计的PHP扩展,可以大幅提升PHP的性能。它支持异步IO、协程、多进程等特性,在网络编程、高负载场景中表现出色。本文将介绍Swoole如何支持异步SSH操作。一、SSH介绍SSH(SecureShell)是一种加密的网络协议,用来在网络中进行安全地传输信息。SSH协议具有安全、可靠、跨平台等特点,广泛应用于远程登录、文件传输、

如何使用ThinkPHP6进行异步日志记录操作?如何使用ThinkPHP6进行异步日志记录操作?Jun 12, 2023 am 09:57 AM

随着互联网的高速发展,日志记录服务成为了每个大型web应用必不可少的模块。为了方便错误排查、性能监控等各种需求,本文将介绍如何使用ThinkPHP6框架进行异步日志记录操作。1.什么是日志记录在计算机科学领域,日志记录是指将计算机系统中发生的事件和信息记录下来。通常,这些记录都以文件或数据库的形式存储。日志记录有助于了解系统运行状况,及时发现和解决

PHP8.1新增的异步HTTP客户端PHP8.1新增的异步HTTP客户端Jul 08, 2023 pm 07:24 PM

PHP8.1新增的异步HTTP客户端随着互联网的快速发展,各种Web应用程序的性能也变得越来越重要。为了提供更好的用户体验,开发人员需要使用高效的工具和技术来处理各种网络请求。幸运的是,PHP8.1引入了一个全新的功能,即异步HTTP客户端,它允许我们以非阻塞的方式执行HTTP请求,从而提高应用程序的性能。通过异步HTTP客户端,我们可以在发送请求后继续执行

如何利用Celery、Redis和Django实现异步任务队列如何利用Celery、Redis和Django实现异步任务队列Sep 27, 2023 pm 11:18 PM

如何利用Celery、Redis和Django实现异步任务队列引言:在Web开发中,经常需要处理一些耗时较长的任务,如发送邮件、生成报表、处理大量数据等。如果将这些任务直接放在视图函数中处理,会导致请求响应时间过长,用户体验不佳。为了提高系统的性能和响应速度,我们可以使用异步任务队列来处理这些耗时的任务。Celery是一个广泛使用的Python的异步任务队列

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),