ノードjs REST APIで非同期メソッドを使用する方法を学習しようとしています。ノード非同期メソッドがイテレータからの結果を検出しない
ゴール
私は各1を通じてキーの範囲のためのデータベース...とループを問い合わせます。私は、結果が現在の日付/時刻スタンプと一致するかどうかチェックし、そうであれば一致するキーに対してHGETALLクエリを実行します。 HGETALLの結果をjsonデータとして自分のREST APIのコンシューマーに送信したいと思います。
問題
私のコードが正しくHGETALLのために、後で、その後...キーの初期セットのためのデータベースを照会し。 しかし、結果を送り返そうとすると、現在Webページには何も表示されません。
ここでは、コードです:私はRedisのデータベースへの私の最初のクエリをオフに送信ところ
var id_rule = function (redis_key, doneCallBack) {
console.log('iterator called with key:' + redis_key);
//if this is the default rule, skip it
if (redis_key.indexOf('00:00_00:00') == -1){
//time match
var rule_times = parse_time_from_key(redis_key);
var current = getCurrentUTC(); // returns something like [ 1158, 'mon' ]
if ((current[0] >= rule_times[0] && current[0] <= rule_times[1]) && (rule_times[2].indexOf((current[1].substring(0,1))) != -1)) {
var widgetkey = redis_key.split("widget:");
redis.hgetall("widget:" + widgetkey[1], function (err, data) {
if (err) {
console.log("hgetall method fails: " + err);
return doneCallBack(err, false);
}
if (data) {
console.log('bingo: ' + widgetkey[1] + "returned a match");
console.log(data);
return doneCallBack(false, data);
} else {
return doneCallBack(false, false);
}
});
} else {
return doneCallBack(false, false);
}
};
}
router.get('/:widgetnum', function(req, res, next) {
//validate widgetnum format
var widgetnum = req.params.widgetnum;
if (!valid_e164(widgetnum)) {
var retval = {"res":false, "msg":"malformed widget"};
res.send(JSON.stringify(retval));
}
console.log('scanning db for: widget:' + widgetnum + "*");
redis.send_command("SCAN", [0, "MATCH", "widget:" + widgetnum + "*", "COUNT","1000"], function (err, reply) {
if (err) {
res.send(JSON.stringify({"res":false,"msg":"no matching widget records found"}));
}
if (reply) {
if (reply[1].length == 2) {
//queryfordefault rule
async.map(reply[1], queryhgetall_default_rule, function(err, results) {
console.log('inside here!');
res.send(JSON.stringify(results));
});
} else {
async.map(reply[1], id_rule, function (err, iteration_results) {
if (err) {
res.send(JSON.stringify("false"));
}
if (iteration_results) {
res.send(JSON.stringify(iteration_results));
}
});
}
}
});
});
37行目であり、それは結果の配列を返します。
行49-56は、イテレータメソッド...を結果セットの各結果に対して1回呼び出す非同期メソッドです。
18行目では、イテレータから非同期メソッドにデータを戻そうとしています。
質問明らかに、私はこれが私の最初の質問になりますので、私は私のデータを返すてる方法で何かを台無しにしました
- あなたは私が間違ってやっているかを見ることができます。
私が探しているものを見つけたら、reply [1](行49)を使って反復を止めるにはどうしたらいいですか?またqueryhgetall_default_ruleとid_ruleため