2016-09-29 38 views
0

背景信息節點JS async.map嘗試用空的結果未能

這是我在節點第一次嘗試......現在的異步模塊。我很難同步調用我的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命令證明我已正確查詢每個k的callerid值但是我將這些數據返回給GET方法的方式可能不正確,因爲一切都是空的。

你能告訴我我錯過了什麼嗎?我試圖按照這裏的例子: http://javascriptplayground.com/blog/2013/06/think-async/

回答

0

我想我想通了。我改變了這一點:

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 }; 

這樣:

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 }; 
+0

大聲笑我只是打入.. –

+0

謝謝傑森。是的,我認爲你只是在我做之後發佈......或者非常接近它。 – Happydevdays

0

移動return doneCallBack了其他函數中像線38-39所以它會等待redia數據調用回調之前。