Node js async.映射尝试失败,结果为空

node js async.map attempt is failing with empty result

本文关键字:结果 失败 js async 映射 Node      更新时间:2023-09-26

背景信息

这是我第一次尝试在节点…现在是async模块。我很难对我的redis数据库进行同步调用。

最终,我需要做的是当用户调用我的REST API的GET方法时,我希望返回一个json对象,看起来像这样:

 [ { '10.123': '1111111111' },
  { '10.126': '2222222222' },
  { '10.125': '3333333333' },
  { '10.222': '4444444444' },
  { '10.131.90': '5555555555' },
  { '10.18': '6666666666' },
  { '10.19': '7777777777' },
  { '10.44': '8888888888' } ]

上面看到的键是使用主GET方法中的SCAN命令查询的。然后,对于redis SCAN返回的每个键,我转过来并运行"HGETGALL"命令来查找您在上面看到的值

虽然queryhgetall函数在主GET方法中每个键被正确地调用一次…此方法返回的数据为空。下面是我的代码:

25 //async test start ====================================================================================
 26 var async = require('async');
 27 
 28 var queryhgetall = function (redis_key, doneCallBack) {
 29         var tempObject = {};
 30         redis.hgetall(redis_key, function (err, data) {
 31                 if (err) {
 32                         console.log("hgetall method fails: " + err);
 33                 }
 34                 if (data) { 
 35                         var key = redis_key.split(":");
 36                         tempObject[key[1]]=data.callerid;
 37                         console.log(tempObject);
 38                 }       
 39         });
 40         return doneCallBack(null,tempObject);
 41 };
 42 
 43 router.get('/', function (req, res, next) {
 44     redis.send_command("SCAN", [0, "MATCH", "emergency:*"], function (err, reply) {
 45         if (reply) {
 46             var retdata = [];
 47             async.map(reply[1], queryhgetall, function (err, results) {
 48                 console.log("finished");
 49                 console.log("results start");
 50                 console.log(results);
 51                 console.log("results stop");
 52             });
 53             }
 54      });    
 55 });  
 56 
 57 //async test finish =====================================================================================================

代码输出

下面是我在控制台输出中看到的内容:

GET /emergency/ - - ms - -
finished
results start
[ {}, {}, {}, {}, {}, {}, {}, {} ]
results stop
{ '10.123': '1111111111' }
{ '10.126': '2222222222' }
{ '10.125': '3333333333' }
{ '10.222': '4444444444' }
{ '10.131.90': '5555555555' }
{ '10.18': '6666666666' }
{ '10.19': '7777777777' }
{ '10.44': '8888888888' }

从输出中可以看到,第37行的console.log命令证明我已经正确地查询了每个键的callerid值,但是我将这些数据返回给GET方法的方式可能是不正确的,因为所有内容都是空的。

你能告诉我我错过了什么吗?我试着效仿这个例子:http://javascriptplayground.com/blog/2013/06/think-async/

我想我明白了。我改了这个:

 28 var queryhgetall = function (redis_key, doneCallBack) {
 29         var tempObject = {};
 30         redis.hgetall(redis_key, function (err, data) {
 31                 if (err) {
 32                         console.log("hgetall method fails: " + err);
 33                 }
 34                 if (data) { 
 35                         var key = redis_key.split(":");
 36                         tempObject[key[1]]=data.callerid;
 37                         console.log(tempObject);
 38                 }       
 39         });
 40         return doneCallBack(null,tempObject);
 41 };

to this:

 28 var queryhgetall = function (redis_key, doneCallBack) {
 29         var tempObject = {};
 30         redis.hgetall(redis_key, function (err, data) {
 31                 if (err) {
 32                         console.log("hgetall method fails: " + err);
 33                 }
 34                 if (data) { 
 35                         var key = redis_key.split(":");
 36                         tempObject[key[1]]=data.callerid;
 37                         console.log(tempObject);
 38                         return doneCallBack(null, tempObject);
 39                 }
 40         });
 41 //      console.log(tempObject);
 42 //      return doneCallBack(null,tempObject);
 43 };

return doneCallBack向上移动到其他函数中,如第38-39行,以便在调用callback之前等待媒体数据