Экспорт массива в ".then" не работает - PullRequest
0 голосов
/ 31 января 2019

Я новичок в NodeJS и знаком только с Java.Я пытаюсь создать файл, который создает объекты на основе базы данных и добавляет их в массив.Я хочу иметь возможность экспортировать этот массив, чтобы использовать его во всей программе, но когда я пытаюсь экспортировать массив, он не работает.Я попробовал поискать в Google и понять, но, к сожалению, не нашел ничего полезного.

Я надеюсь, что кто-то может помочь мне понять

Я попытался вызвать module.exports после ".then ", но он просто возвращает пустой массив, потому что его асинхронный.Я также пытался вызвать module.exports = команды внутри вызова .then, но он не сработал.

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 голосов
/ 31 января 2019

Простой

  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().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...