Возвращать обещание, которое содержит array с данными, полученными от других обещаний

Я вооружаю функцию в expresJS, что используя две простые функции выполнил две консультации SQL используя Knex в две отличные базы данных, но будь должен возвращать как ответ обещание.

function qDB1(status_id) {
  return KnexDB1
  .select()
  .from('table1')
  .where({
    status: status_id
  })
  .orderBy('date')
  .catch(function(err) {
    console.log(err);
  });
}

function qDB2 () {
  var dateStart=Moment().format('L');
  var dateEnd=Moment().add(1, 'days').format('L');
  return KnexImc
  .raw("EXEC SP_DB2 'QU', '"+dateStart+"','"+dateEnd+"'")
  .catch(function(err) {
    console.log(err);
  });
}

QueryRepo.prototype.select = function(status_id) {

  if ( !status_id) {
    status_id=1;
  }
  var results = [];

  qDB1(status_id)
  .then(function (res) {
    for(var idx = 0; idx < res.length; idx++){
      console.log(res[idx]);
      results.push(res[idx]);
    }
  });
  qDB2()
  .then(function (res) {
    for(var idx2 = 0; idx2 < res.length; idx2++){
      console.log(res[idx2]);
      results.push(res[idx2]);
    }
  });

  return Promise.all(results);

};

Когда я выполняю функции qDB1 и qDB2 они функционируют хорошо и загружают данные в results, проблема, - что, выполнив select обещание прибывает как пустой array.

Я знаю, что он мог бы возвращать array resuls как только были завершены обещания Knex, но необходимо, чтобы ответ был обещанием.

0
задан 18.01.2017, 06:36
0 ответов

Ты используешь плохо Promise.all. Я рекомендую тебе смотреть, как оно функционирует здесь. Главным образом Promise.all получи как параметр promises. Если ты fijás хорошо, в select ты был бы должен делать следующее:

return Promise.all([qDB1(status_id), qDB2()]).then(function(values){
    // Merge the two query results
    var promiseResults = values[0].concat(values[1]);

    var results;

    for(var idx = 0; idx < promiseResults.length; idx++){
        results.push(promiseResults[idx]);
    }
    // Returns a promise with the results
    return Promise.resolve(results);
}).catch(function(error){
    console.log(error);
});
  • Достань catch qDB1 и qDB2.

Это возвратило бы одну promise. Поэтому, когда ты позвонишь в select ты был бы должен использовать:

select().then(function(results){
    console.log(results);
});
1
ответ дан 03.12.2019, 17:38
  • 1
    Большое спасибо из-за ответа я функционирую в совершенство. –  20.01.2017, 21:57