使用.join()调用异步承诺内的异步承诺

我使用node / epxress,mysql和bluebird。

在客户端请求它之后,我正在执行异步数据库操作。 在第一个数据库操作的回调中,我必须首先执行一些计算,然后再执行两个数据库查询,这些查询是为客户端提供正确结果所必需的。

我的代码被分成一个Controller类,它处理get / post请求。 在中间是业务逻辑的服务类,它与在数据库中查询的数据库类进行对话。

我目前能够执行第一个和第二个数据库请求。

getVacation(departmentID) {

        return departmentDatabase.getVacation(departmentID)
            .then(result => [ result, result.map(entry => this.getDateRange(new Date(entry.dateFrom), new Date(entry.dateTo))) ])
            .spread(function(result, dateRange){
                var mergedDateRange = [].concat.apply([], dateRange);
                var counts = {};
                mergedDateRange.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });

                return [{"vacationRequest": result, "dateRange": dateRange, "countedDateRange": counts}];
            })
             .then( result => [result, departmentDatabase.countUser(departmentID)])
             .spread(function (result, userOfDepartmentCount){
                console.log(userOfDepartmentCount);
                console.log(result);
                //console.log(blocked);

                return departmentID; //return just for not running into timeout
            })
            .catch(err => {
                // ...do something with it...
                // If you want to propagate it:
                return Promise.reject(err);
                // Or you can do:
                // throw err;
            });
    }

但是当试图执行第三次我遇到麻烦时。 为了解决这个问题,我阅读了Bluebird Docs,它指向了.all .all()或(甚至更好) .join() 。 但试图使用他们中的任何一个都没有为我工作。

如果我尝试使用.join()总是导致join is not a function ,我觉得这join is not a function困惑,因为我可以使用所有其他函数。 我也试图要求

var Promise = require("bluebird");
var join = Promise.join;

但即使这样也没有帮助。

目前我只需要在我的数据库类中使用Bluebird作为Promise。

所以现在我的整个服务课。

'use strict';

var departmentDatabase = require('../database/department');
var moment = require('moment');

class DepartmentService {
    constructor() {
    }

    getVacation(departmentID) {

        return departmentDatabase.getVacation(departmentID)
            .then(result => [ result, result.map(entry => this.getDateRange(new Date(entry.dateFrom), new Date(entry.dateTo))) ])
            .spread(function(result, dateRange){
                var mergedDateRange = [].concat.apply([], dateRange);
                var counts = {};
                mergedDateRange.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });

                return [{"vacationRequest": result, "dateRange": dateRange, "countedDateRange": counts}];
            })
            //THIS DOES NOT WORK
            .join(result => [result, departmentDatabase.countUser(departmentID), departmentDatabase.blockedDaysOfResponsible(departmentID)])
            .spread(function (result, userOfDepartmentCount, blocked){
                console.log(userOfDepartmentCount);
                console.log(result);
                console.log(blocked);

                return departmentID;
            })
            .catch(err => {
                // ...do something with it...
                // If you want to propagate it:
                return Promise.reject(err);
                // Or you can do:
                // throw err;
            });
    }

    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;
    }
}

module.exports = new DepartmentService();

有人能够给我一个例子如何做到这一点?

编辑:

这里有一个示例代码,我在我的databaseCall中使用,返回数据库结果和承诺

return Promise.using(dbConnection.getConnection(), function (conn) {
            return conn.queryAsync(sql, [departmentID])
                .then(function (result) {
                    return result;
                })
                .catch(function (err) {
                    return err;
                });
        });

Promise.join很好,但它可能不适合你的情况。 Promise.all将结合你在那里的几个承诺到一个单一的决议:

.then(result => Promise.all([result, departmentDatabase.countUser(departmentID), departmentDatabase.blockedDaysOfResponsible(departmentID)])]‌​))

然后你可以将这个结果(一个数组)分布到一个函数调用中:

.spread(function(a, b, c) {
    console.log("Results", a, b, c);
});

Promise.all接受Promises数组,等待所有的Promise.all解析(或拒绝),然后将结果以有序数组的形式继续放入随后的.then (或其他promise)子句中。


如果你正在寻找一个模块,使承诺的控制流程更容易,那么你可能会喜欢重新排序。 Promise.all可能在这里做的伎俩,但如果你需要解决的结果,那么relign.parallelrelign.series可能会更好。

链接地址: http://www.djcxy.com/p/55491.html

上一篇: Calling async promises inside async promise using .join()

下一篇: callback is not a function