2016-11-10 10 views
2

私はnode/express、mysql、bluebirdで作業しています。非同期の約束で配列を反復する

私はこれまでに働いている非同期データベース呼び出しを約束しています。しかし、今私は、結果(配列)を反復し、計算目的のための関数を呼び出したいと思います。

マイコードは、get/ postリクエストを処理するControllerクラスに分かれています。真ん中にはビジネスロジック用のサービスクラスがあり、データベース内でクエリを実行するデータベースクラスと通信します。

他のものは完全に動作しているので、サービスクラスを表示するだけです。結果配列と呼び出し関数を実行して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

うわー、完璧!これは私が必要だったものです。 – BayLife

関連する問題