导出“然后”不工作内的数组

时间:2019-01-31 15:38:41

标签: arrays node.js asynchronous module

我是新来的和的NodeJS只熟悉Java。我试图创建一个用于创建基于数据库的对象,并将它们添加到一个数组中的文件。这阵我希望能够出口,这样我可以在整个程序中使用它,但是当我尝试将阵列导出不起作用。我试着用搜索引擎和理解,但跨越任何不幸有益的还没来。

我希望有人能帮助我理解

我试过调用“于是”呼叫后module.exports,但它只是返回一个空数组,因为它的异步。 我也曾尝试在.then调用中调用module.exports = team,但两者均无效。

var teams = [];

function assignTeamsToClasses() {
    return new Promise((resolve, reject) => {
        getAllTeamsInDb((teamList) => {
            teamList.forEach((aTeam) => {
                let newTeam = new Team(aTeam['teamid'], aTeam['teamname'], aTeam['teamrank']);

                teams.push(newTeam);
            });
            resolve();
        });

    })
}

assignTeamsToClasses().then(() => {
    module.exports = teams;
});

main.js

var teams = require('./initialize.js');
console.log(teams);

我希望它返回是数据库中的所有球队。我知道在“ .then”调用中调用时数组不是空的,但是导出部分却不是。

1 个答案:

答案 0 :(得分:1)

简单

  1. 序列require() + console.log()是同步的
  2. assignTeamsToClasses()是异步的,即它在某个未知的稍后时间更新teams

您必须将模块API设计为异步的,例如通过提供客户端可以订阅的事件侦听器界面或Promise接口来接收“数据库更新完成”事件。

提案:

module.exports = {
    completed: new Promise(resolve =>
        getAllTeamsInDb(teams => {
            const result = [];
            teams.each(aTeam =>
                result.append(new Team(aTeam.teamid,
                                       aTeam.teamname,
                                       aTeam.teamrank)
                )
            );
            resolve(result);
        })
    ),
};

如何使用它:

 const dbAPI = require('./initialize.js');
 dbAPI
     .completed
     .then(teams  => console.log(teams))
     .catch(error => /* handle DB error here? */);

每个使用此API的调用者都会

  • 在数据库访问完成之前被阻止,或者
  • 从已经解决的承诺中收到result,然后继续进行其then()回调。