为什么我不能在异步承诺中调用同步函数?

时间:2016-11-14 07:30:46

标签: javascript node.js express asynchronous bluebird

我正在使用express / node,mysql和bluebird。

我正在使用Promise.all()执行三次异步数据库查询。完成这些后,我必须做一些计算。

如果我这样做,我可以成功调用函数getDateRange(),但这导致我遇到问题,我在处理错误时遇到了麻烦。

return Promise.all([departmentDatabase.getVacation(departmentID), departmentDatabase.countUser(departmentID), departmentDatabase.blockedDaysOfResponsible(departmentID)])
            .then(departmentData =>  [departmentData, departmentData[0].map(entry => this.getDateRange(new Date(entry.dateFrom), new Date(entry.dateTo)))] )
            .spread(function(departmentData, dateRange){

                var mergedDateRange = [].concat.apply([], dateRange);
                var counts = {};
                mergedDateRange.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });       //Zähle doppelt vorkommende Daten

                var departmentMinStock = departmentData[0][0].departmentMinStock;
                var blockedDays = [];

                for (var p in counts) {
                    if( counts.hasOwnProperty(p) ) {
                        if( (parseInt(departmentData[1][0].amount) - parseInt(counts[p])) <= parseInt(departmentMinStock)) {
                            blockedDays.push(p);
                        }
                    }
                }
                return [{"vacationRequest": departmentData[0], "blockedDays": blockedDays}, departmentData[2]];
            })
            .catch(err => {
                // ...do something with it...
                // If you want to propagate it:
                return Promise.reject(err);
                // Or you can do:
                // throw err;
            });

如果departmentData未定义,可能会经常退出,我没有真正的选择(我知道)停止所有后续的.then()调用,只返回一个空数组。我可以返回一个空数组,但是我必须在每个.then()中进行检查。

所以我想,因为我使用Promise.all()我没有真正遵循异步操作,因此我可以在.all()的回调中完成所有逻辑。

但如果我尝试这样做:

 return Promise.all([departmentDatabase.getVacation(departmentID), departmentDatabase.countUser(departmentID), departmentDatabase.blockedDaysOfResponsible(departmentID)])
            .then(function(data){

                var d = [];
                for(var i = 0; data[0].length > i; i++){
                    //console.log(this.getDateRange(new Date(data[0][0].dateFrom), new Date(data[0][0].dateTo)));
                    //console.log(data[0][i].dateFrom);
                    //console.log(data[0][i].dateTo);
                    var x = this.getDateRange(data[0][i].dateFrom, data[0][i].dateTo);
                    console.log(x);
                   // d.push(this.getDateRange(new Date(data[0][0].dateFrom), new Date(data[0][0].dateTo)));
                }

                return 1;
            })

导致错误TypeError: Cannot read property 'getDateRange' of undefined。但console.log(data[0][i].dateFrom);有一个我检查过的值。

这是我的getDateRange函数:

 getDateRange(startDate, stopDate) {
        var dateArray = [];
        var currentDate = moment(startDate);
        while (currentDate <= stopDate) {
            dateArray.push(moment(currentDate).format('YYYY-MM-DD'))
            currentDate = moment(currentDate).add(1, 'days');
        }

        return dateArray;
    }

有人可以解释为什么会发生这种情况吗?在这种情况下,最好的例子就是如何做到这一点?

0 个答案:

没有答案