2017-02-01 10 views
1

Я пытаюсь создать отчет, который растягивает пределы моего понимания как Node, так и MySQL.Перевод цикла while на обещание

У меня есть already established, что мне нужна ежегодная информация о дате, которую я хочу вызывать на каждый год, который я хочу отобразить. Теперь у меня есть запрос, который может вернуть нужные мне данные, мне просто нужно повторить это в среде Node.

Исходя из фона Delphi следующий код предоставить мне данные мне нужно

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

Мне нужно, чтобы иметь возможность отправить посыл к серверу БД (GetData) и заполнить turnoverObj и dateArray appropriatly. Это нужно повторить, пока qd не будет больше сегодняшней даты.

ответ

1

Вы можете использовать .map() функции Bluebird обещания:

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

Надеется, что это помогает как-то.

+0

К сожалению, в настоящее время мы используем ES6 Promises, но это может сработать, если не будет другого выбора. Другой темой, о которой я думал, является использование Promise.All после определения каждого запроса как обещания в массиве. Любые причины, по которым не нужно? –

+1

Да, конечно, это была моя вторая мысль. В таком случае вы просто выполняете цикл «date.forEach», в котором вы могли бы создать обещание, используя одну «дату» и надавить на массив обещаний. Затем просто выполните 'Promise.all (обещания)' – piotrbienias