【问题标题】:Exporting an array within an ".then" doesnt work在“.then”中导出数组不起作用
【发布时间】:2019-06-25 02:57:56
【问题描述】:

我是 NodeJS 的新手,只熟悉 Java。我正在尝试创建一个文件,该文件基于数据库创建对象并将它们添加到数组中。我希望能够导出这个数组,以便我可以在整个程序中使用它,但是当我尝试导出数组时它不起作用。我试过谷歌搜索和理解,但不幸的是没有发现任何有用的东西。

希望有人能帮我理解

我尝试在“.then”调用之后调用 module.exports,但它只返回一个空数组,因为它是异步的。 我也尝试在 .then 调用中调用 module.exports = teams 但它也没有工作。

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”调用中调用时数组不是空的,但导出部分不是。

【问题讨论】:

    标签: arrays node.js asynchronous module


    【解决方案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 的调用者都会

    • 要么在数据库访问完成之前被阻止,要么
    • 从已解决的 Promise 中接收 result 并继续其 then() 回调。

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 2021-08-19
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多