Экспорт массива из обещания, но не загрузка при необходимости в другом файле? - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь сделать запрос из базы данных, и мне нужно объединить результаты нескольких столбцов в один массив. Я достиг этого, сделав все запросы в Promise.all (), и это работает. Однако проблема в том, что мне нужно получить доступ к этим данным в другом файле. Когда мне требуется файл A в моем файле B, массив кажется пустым?

fileA. js

const days = ["monday", "tuesday", "wednesday"] 

function dbRequest(day){

    return knexInstance.select('shift_time',`${day}`).from('shr');
}

Promise.all([
            dbRequest(days[0] ? days[0]: null),
            dbRequest(days[1] ? days[1]: null),
            dbRequest(days[2] ? days[2]: null)
])
.then(results => {
    shiftR = results;
    console.log(shiftR)
    module.exports = { shiftR }; //the array only contains the dates once all the promises have been executed
});

FileB. js

const shiftR = require('./fileA');

console.log(shiftR);

I нахожусь в тупике о том, как это исправить. Если есть лучший способ выполнить sh то, что я пытаюсь сделать, тогда я был бы признателен за предложения.

Для контекста, это то, как выглядит база данных, но я не думаю, что эта информация нужен для вопроса.

shift_time  monday  tuesday  wednesday (...)
6 AM        1       1        1      
7 AM        2       2        2  
8 AM        3       3        3  
9 AM        3       3        3  

1 Ответ

2 голосов
/ 19 января 2020

Назначьте Promise.all обещание на module.exports, чтобы вы могли позвонить .then на обещание в другом файле:

// fileA.js
module.exports = Promise.all([
            dbRequest(days[0] ? days[0]: null),
            dbRequest(days[1] ? days[1]: null),
            dbRequest(days[2] ? days[2]: null)
])
.then(results => {
    return { shiftR: results };
});
// FileB.js

const shiftRProm = require('./fileA');
shiftRProm.then(({ shiftR }) => {
  console.log(shiftR);
});

Если вы вы только пытаетесь передать разрешенное значение shiftR в FileB, и ничего больше, тогда нет необходимости помещать результаты в объект и деструктурировать:

// fileA.js
module.exports = Promise.all([
            dbRequest(days[0] ? days[0]: null),
            dbRequest(days[1] ? days[1]: null),
            dbRequest(days[2] ? days[2]: null)
]);
// FileB.js

const shiftRProm = require('./fileA');
shiftRProm.then((shiftR) => {
  console.log(shiftR);
});

Вы можете обрезать код, вызванный .map в массиве days:

function dbRequest(day = null) {
  return knexInstance.select('shift_time', String(day)).from('shr');
}
module.exports = Promise.all(days.map(dbRequest));
...