2017-02-01 10 views
1

ノードとMySQLの両方の理解の限界を広げているレポートを作成しようとしています。whileループを約束に変換

私はalready establishedを持っています。私が必要とする年間の日付情報は、毎年私が表示したいと思うように呼び出す必要があります。私は今、私が必要とする正しいデータを返すことができるクエリーを持っています。ノード環境内でそれを繰り返すだけです。 Delphiの背景から、次のコードをカミング

は私がDBサーバ(のgetData)への約束を送信しappropriatly turnoverObjdateArrayを移入できるようにする必要があり

LoadTurnover = function (req, reply) { 

    const queryDay = "-04-06"; 
    const maxDate = new Date(); 
    let queryYear = 2000; 

    let qd  = new Date(queryYear + queryDay); 
    let dateArray = []; 

    while (qd < maxDate) {  
     // Get the data from the server 
     let data = getData(sql); 
     // 
     let turnoverObj = {}; 
     turnoverObj.date = qd; 
     turnoverObj.Employees = data[0][0].Employees; 
     turnoverObj.Leavers = data[1][0].Leavers; 
     // Add current year data to our result set 
     dateArray.push(turnoverObj); 
     // Setup the next year condition 
     queryYear ++; 
     qd = new Date(queryYear + queryDay); 
    } 
}; 

を必要とするデータを私に提供するでしょう。これは、qdが今日の日付よりも大きくなるまで繰り返す必要があります。これは何とか助け

var Promise = require('bluebird); 

let dates = []; 
let dateArray = []; 

while (qd < maxDate) { 
    dates.push(qd); 
    queryYear++; 
    qd = new Date(queryYear + queryDay); 
} 

Promise.map(dates, function(singleDate){ 
    return getData(sql).then(function(data){ 
     let turnoverObj = {}; 
     turnoverObj.date = singleDate; 
     turnoverObj.Employees = data[0][0].Employees; 
     turnoverObj.Leavers = data[1][0].Leavers; 

     dateArray.push(turnoverObj); 
     return; 
    }); 
}).then(function(finalResult){ 
    console.log(dateArray); 
}); 

希望:

答えて

1

あなたはBluebird約束の.map()機能を使用することができます。

+0

残念ながら、私たちは現在ES6 Promisesを使用していますが、他に選択肢がない場合にはこれが有効です。私が考えているもう一つの欠点は、Promise.AllをPromiseを配列として設定した後に使用することです。なぜならないのか? –

+1

はい、確かに、私の第二の考えでした。そのような場合、単に 'dates.forEach'ループを実行すると、単一の' date'を使って約束を作成し、それをpromises配列にプッシュすることができます。次に、単に「Promise.all(約束)」をします。 – piotrbienias

関連する問題