Обещания с NodeJS - PullRequest
       4

Обещания с NodeJS

0 голосов
/ 22 ноября 2018

Я бы хотел использовать обещания с NodeJS, но, похоже, он не работает должным образом.

Я хотел бы видеть LOG 1, LOG 2 и LOG 3 для всех файлов в этом порядке.И LOG 4 скрыто ...

Но я получаю это:

LOG 1
LOG 3
LOG 1
LOG 3
LOG 1
LOG 3
SUCCESS LOG 2
SUCCESS LOG 2
SUCCESS LOG 2
SUCCESS LOG 2

Мой код:

var filePromise = _.map(files, function(file) {

var filePath = './sql/' + file;

fs.lstat(filePath, function(err, stats) {

  if (stats.isFile() && file !== '.gitignore' && file !== 'index.js') {

    fs.readFile(filePath, 'utf-8', function(err, data) {

      console.log('LOG 1');

      db.query(data).then(function() {
        console.log(colors.green('SUCCESS LOG 2'));
      }).catch(function() {
        console.log(colors.red('ERROR LOG 2'));
      });

      console.log('LOG 3');

    });
  }
});
});

Promise.all(filePromise).then(function() {
  console.log(colors.green('LOG 4'));
});

1 Ответ

0 голосов
/ 22 ноября 2018

Чтобы filePromise содержал коллекцию обещаний, вам нужно возвращать обещание для каждой итерации вызова карты.Только тогда вызов к Promise.all будет оценен правильно.

var filePromise = _.map(files, function(file) {
    return new Promise(function(resolve, reject) {
        var filePath = './sql/' + file;

        fs.lstat(filePath, function(err, stats) {

            if (stats.isFile() && file !== '.gitignore' && file !== 'index.js') {

                fs.readFile(filePath, 'utf-8', function(err, data) {

                    console.log('LOG 1');

                    db.query(data).then(function() {
                        console.log(colors.green('SUCCESS LOG 2'));
                        resolve();
                    }).catch(function() {
                        console.log(colors.red('ERROR LOG 2'));
                        reject();
                    });

                    console.log('LOG 3');

                });
            } else {
                reject(new Error("failed condition"))
            }
        });
    })
});

Promise.all(filePromise).then(function() {
    console.log(colors.green('LOG 4'));
});

Это не исправит порядок ваших журналов консоли.Это отдельная проблема.Журналы вашей консоли на самом деле не в порядке, они регистрируются, как и ожидалось.Однако это происходит из-за асинхронного вызова, который вы делаете на db.query, который при срабатывании не блокирует ожидание ответа.Вместо этого следующая строка выполняется сразу после возврата вызова функции.

Примечание: Обязательно обработайте ваши err аргументы, переданные встроенным функциям обратного вызова fs.lstat и fs.readFile.Невыполнение этого условия приведет к тому, что обещание не будет выполнено в случае ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...