首页 > 解决方案 > 从承诺中导出数组,但在另一个文件中需要时不加载?

问题描述

我正在尝试从数据库发出请求,我需要将多列的结果组合到一个数组中。我通过在 Promise.all() 中提出所有请求来实现这一点,并且它可以工作。但是,问题是我需要在不同的文件中访问这些数据。当我在 fileB 中需要 fileA 时,数组似乎为空?

文件A.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
});

文件B.js

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

console.log(shiftR);

我很困惑如何解决这个问题。如果有更好的方法来完成我正在尝试做的事情,那么我将不胜感激这些建议。

对于上下文,这就是数据库的样子,但我认为这个问题不需要这些信息。

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  

标签: javascriptpostgresqlpromisejavascript-objectsrequest-promise

解决方案


Promise.all promise分配给module.exports,以便您可以调用.then另一个文件中的 Promise:

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

推荐阅读