Node js async.映射尝试失败,结果为空
node js async.map attempt is failing with empty result
背景信息
这是我第一次尝试在节点…现在是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之前等待媒体数据
相关文章:
- 奇怪的Javascript结果
- Javascript(jQuery)给了我奇怪的结果
- JSONP请求返回结果,但也触发error_callback
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- Javascript,输出结果后页面不断刷新
- 这是使用html快照和谷歌获取的预期结果吗?SEO/SPA
- JsFiddle在分叉后描述失败
- 承诺,如果第一个失败,则返回第二个承诺结果
- 无需重新加载即可播放MySQL结果.AJAX 正在失败
- 咖啡脚本化的 ajax 调用结果在实际成功时失败回调
- Ajax 注册失败不会回显结果
- AngularJS中将筛选器结果绑定到输入失败
- 返回表单提交的结果从 PHP 到 JavaScript,区分成功和失败
- Javascript布尔结果失败
- Node js async.映射尝试失败,结果为空
- Redis客户端和节点js - hgetall方法失败,结果为空
- 在失败之前轮询结果n次(尝试之间有延迟)
- 404而将JS变量推到PHP,调用PHP函数,将结果作为JSON字符串传递给JS,并可能在使用它时失败
- 需要想法显示登录失败的结果在同一网页