在异步承诺中迭代数组

时间:2016-11-10 12:35:44

标签: javascript arrays asynchronous bluebird

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

我正在使用Promises进行异步数据库调用,这是迄今为止的工作。但现在我想迭代结果(数组)并调用函数进行计算。

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

现在我将只显示我的服务类,因为其他一切都运行正常,我只是不知道如何运行结果数组和调用函数,它返回一个日期范围。

'use strict';

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

class DepartmentService {
    constructor() {
    }

    getVacation(departmentID) {
        return departmentDatabase.getVacation(departmentID).then(function (result) {

            //Without promises I did this, which worked.
            //for(var i = 0; result.length > i; i++){
            // var dateRange = this.getDateRange(new Date(result[i].dateFrom), new Date(result[i].dateTo));
            //console.log(dateRange);
            //}
            return result;

        })

        //If I do it static, the dateRange function is successfully called
        //But here I don´t know how to do it for the entire array.
        //Also I don´t know, how to correctly get the result dateRange()
        .then(result => this.dateRange(result[0].dateFrom, result[0].dateTo))
        //.then() Here I would need an array of all dateRanges
        .catch(function (err) {
            console.log(err);
        });
    }

    getDateRange(startDate, stopDate) {
        console.log("inDateRange");
        console.log(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();

希望有人能给我一个如何正确行事的例子。

1 个答案:

答案 0 :(得分:1)

在新代码中,您只处理第一个结果。您可能需要map

.then(result => result.map(entry => this.dateRange(entry.dateFrom, entry.dateTo)))

因此,在删除旧代码的情况下:

getVacation(departmentID) {
    return departmentDatabase.getVacation(departmentID)
    .then(result => result.map(entry => this.dateRange(entry.dateFrom, entry.dateTo)))
    .catch(function (err) {
        console.log(err);
        // WARNING - This `catch` handler converts the failure to a
        //           resolution with the value `undefined`!
    });
}

请注意上面的警告。如果要传播错误,则需要明确地执行此操作:

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