Асинхронный метод узла не обнаруживает результаты от итератора

Я пытаюсь узнать, как использовать асинхронный метод в моем узле JS REST API.

Цель

Я запрашиваю базу данных для диапазона ключей… и петля через каждый из них. Я проверяю, соответствуют ли какие-либо результаты моей текущей дате / времени, и если это так, я делаю запрос HGETALL на соответствующем ключе.
Я хотел бы отправить результаты hgetall как данные json потребителю моего REST API.

Проблема

Мой код правильно запрашивает базу данных для начального набора ключей… а потом для HGETALL.
Но.. когда я пытаюсь отправить результаты назад, на веб-странице ничего не отображается.

Вот код:

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 я отправляю свой первый запрос в базу данных redis, и он возвращает массив результатов.

Строки 49-56-это асинхронный метод, вызывающий метод my iterator … один раз для каждого результата в результирующем наборе.

В строке 18 я пытаюсь вернуть данные из итератора обратно в асинхронный метод.

Вопросы

  1. Ясно, что я что — то напутал с тем, как я возвращаю свои данные, поэтому это будет мой первый вопрос-вы видите, что я делаю неправильно.

  2. Как перестать перебирать ответ[1] (строка 49) после того, как я нашел то, что ищу?

1 ответ

    1. Также опубликуйте код queryhgetall_default_rule и id_rule. Но сначала разбейте все это на другой модуль и протестируйте его без части HTTP-запроса.

    2. Посмотреть http://caolan.github.io/async/docs.html#.some .

    Также смотрите в обещания, обещания.any, and await(needs babel) with just a for loop doing one at at time. Это полезные темы, на изучение которых требуется некоторое время.