Чтобы 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
.Невыполнение этого условия приведет к тому, что обещание не будет выполнено в случае ошибки.