вставить данные в массив из Redis внутри foreach в узле js

У меня есть node js redis api, где я читаю данные из redis на основе ключа, а если нет, извлекаю их из другого API, а затем вставляю эти данные в Redis. Также я помещаю эти данные в переменную и в конце foreach хочу вернуть это значение конечному пользователю.

Проблема в том, что Redis работает асинхронно, и в результате моя переменная данных всегда пуста. Как мне обойти это?

Вот соответствующая часть моего кода

   between.forEach(function(entry) {

    asyncTasks.push(function(callback){

        client.exists(id+entry, function(err, reply) {
            if (reply === 1) {
                client.get(id+entry, function(err, reply) {
                    var output = JSON.parse(reply);
                    data_output = data_output.concat(output);
                });
            } else {
                process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
                var slot_url = "https://" + username + ":" + password + "@testapi.foobar.com/1/timeslots?productId=" + id + "&fromDate=" + entry + "&toDate=" + entry;
                request({

                    url: slot_url,
                    json: true,
                    headers: headers
                }, function(error, response, body) {
                    if (!error && response.statusCode === 200) {
                        var data = [];
                        try {
                            var temp = {};
                            console.log(body);
                            body.data.forEach(function(tempslots) {
                                temp['date'] = tempslots['date'];
                                temp['timeslots'] = tempslots['timeslots'];
                                data = data.concat(temp);
                            });
                            client.set(id+entry, JSON.stringify(data));
                            data_output = data_output.concat(data);
                        } catch (err) {
                            console.log(err.message);
                        }
                    } else {
                        console.log("Something went wrong!! " + error.message);
                    }
                })
            }
            callback();
        });
    });

});

async.parallel(asyncTasks, function(){
    // All tasks are done now
    result['data'] = data_output;
    result['response'] = 1;
    result['message'] = 'vacancies list fetched successfully!';
    res.json(result);
});

});

вывод всегда такой {"data":[],"response":1,"message":"Capacity list fetched successfully!"}, хотя я проверил, что код правильно извлекает и вставляет данные в Redis


person Rick Roy    schedule 04.10.2016    source источник
comment
Как мы знаем, узел js асинхронный, поэтому сначала работает foreach, а затем будут установлены ваши данные radis. Поэтому вывод данных пуст.   -  person Himanshu Goyal    schedule 04.10.2016
comment
@HimanshuGoyal Я уже знаю это, я даже использовал async.parallel, чтобы избежать этой проблемы, но это все равно не сработает. Если можно дайте плиз решение   -  person Rick Roy    schedule 04.10.2016
comment
Вы можете использовать обещание stackoverflow.com/questions/25429522/   -  person Himanshu Goyal    schedule 04.10.2016
comment
Я много думаю о вашем коде, и я обнаружил, что вы можете использовать рекурсивную функцию, я всегда использую рекурсивную функцию, чтобы предотвратить эту проблему.   -  person Himanshu Goyal    schedule 04.10.2016
comment
Я пишу код для вас, это может быть полезно   -  person Himanshu Goyal    schedule 04.10.2016


Ответы (1)


person    schedule
comment
не будет работать @HimanshuGoyal Я получаю сообщение об ошибке, cant send header after they are sent означающее, что ответ вашей функции вызывается несколько раз - person Rick Roy; 04.10.2016
comment
Вы просто отслеживаете с помощью console.log, потому что я не проверяю его, но я думаю, что ответ - это вызов один раз. - person Himanshu Goyal; 04.10.2016
comment
нет, меня вызывают несколько раз, каждый раз, когда цикл запускается, странно, я изучаю это, но я думаю, что хороший способ сделать это - использовать асинхронность - person Rick Roy; 04.10.2016