записать результат каждого обещания и оценить - NodeJS - PullRequest
0 голосов
/ 02 ноября 2018

Как записать результаты каждого обещания, выполненного в цикле, чтобы оценить, как только выполнение будет завершено? Мне нужно перенаправить либо на страницу ошибки, либо на основании результатов обещания. Вот шаги:
1. Вызовите retrieveDetails
2. Если указанное выше разрешено, тогда вызовите updateDetails
3. Выше двух шагов выполняются в цикле для каждой ассоциации
4. Определите выполнение всех обещаний и оцените результаты
5. По результатам определим навигацию
На данный момент я получаю сообщение об ошибке «Не удается установить заголовки после их отправки».

Вот псевдокод

let currentData;
let promises = [];
let updateResponse = 'SUCCESS';
let failureFlag;
let failureMsg;
let retrieveData = function(networkID, number) {
    return new Promise(function(resolve, reject) {
            retrieveService.retrieveDetails(networkID, number, function(err, result) {
                if (err) {
                    failureFlag = true;
                    reject(err);
                }
                currentData = result;
                resolve();
            });
        })
        .catch((error) => {
            failureMsg = getfailureMsg();
            failureFlag = true;
        });

};

data.associations.forEach(function(association) {
    var getIndicator = retrieveData(loggedOnUser, association.location);
    getIndicator
        .then(function() {
            let updateIndicator = function(loggedOnUser, key, number, currentData) {
                return new Promise(function(resolve, reject) {
                        updateService.updateDetails(loggedOnUser, key, number, currentData, function(err, result) {
                            if (err) {
                                failureFlag = true;
                                reject(err);
                            } else if (result) {
                                if (result == updateResponse) {
                                    resolve();
                                } else {
                                    failureFlag = true;
                                    reject(result);
                                }
                            }
                        });
                    })
                    .catch((error) => {
                        failureMsg = getfailureMsg();
                        failureFlag = true;
                    });
            };

            if (currentData) {
                var addIndicator = updateIndicator(loggedOnUser, key, association.location, currentData);
            }
            addIndicator
                .then(function() {
                    promises.push(getIndicator);
                })
        })
});
Promise.all(promises)
    .then(function() {
        if (failureFlag) {
            req.flash('info', 'failure');
            res.redirect('/staffSummary');
        } else {
            req.flash('info', 'success');
            res.redirect('/staffSummary');
        }
    })
}
...