2016-11-10 4 views
2

Я работаю с узлом/выражением, mysql и bluebird.Iterate over array в async-обещании

Я использую Promise для создания вызова базы данных async, который работает до сих пор. Но теперь я хочу перебрать результат (массив) и вызвать функцию для вычисления цели.

Мой код разделен на класс контроллера, который обрабатывает запрос get/ post. В середине класс обслуживания для бизнес-логики, который ведет переговоры с классом базы данных, который запрашивает в базе данных.

На данный момент я просто покажу свой класс обслуживания, потому что все остальное работает отлично, я просто не знаю, как запустить массив результатов и функцию вызова, которая возвращает daterange.

'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

В вашем новом коде вы обрабатываете только первый результат. Вы, вероятно, хотите 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; 
}); 
+0

Wow, perfect! Это то, что мне нужно. – BayLife