#node.js #asynchronous #mongoose
#node.js #асинхронный #mongoose
Вопрос:
Я использую библиотеки mongoose 5.4.20, request 2.88.0, q 1.5.1 и deasync 0.1.14.
При использовании .cursor() и .eachAsync () обещания не выполняются в том порядке, который я ожидал. В частности, я делаю запрос к базе данных, и для каждого возвращенного документа я делаю несколько внешних запросов через асинхронную серию. Пример кода выглядит следующим образом:
Запрашивать обещание:
function Request (options) {
const result = Q.defer();
request(options, function (error, response, body) {
if (error) {
result.reject(error);
} else {
result.resolve(body);
}
});
return result.promise;
}
Обещание серии асинхронных:
function Series (entry) {
const result = Q.defer();
const errors = [];
//Iterate over some given array
async.eachSeries(array, function (doc, cb) {
//Make some async request
return Request(doc)
.then(function (body) {
//do stuff with 'body' and 'entry'
})
.then(function () {
//Move to the next doc in 'array'
return cb(null);
})
.fail(function (err) {
//Handle errors
errors.push(err);
//Move to the next doc in 'array'
return cb(null);
});
}, function (err, results) {
if (err) {
errors.push(err);
}
if (errors.length !== 0) {
result.reject(errors);
} else {
console.log('A');
result.resolve();
}
});
return result.promise;
}
Mongoose:
mongooseModel
.find()
.cursor()
.eachAsync(entry => Series(entry))
.then(function () {
console.log('B');
}, function (err) {
console.log(err);
});
Что меня смущает, так это то, что окончательный обратный вызов в .then() после .eachAsync(), похоже, вызывается до того, как обещание в .eachAsync() будет выполнено, т. е. ‘console.log(‘B’)’ вызывается перед ‘console.log(‘A’)’. Я бы ожидал, что .eachAsync () будет ждать, пока обещание не будет выполнено, затем извлекает следующий документ из коллекции и так далее, и только в самом конце, когда все обещания будут выполнены, вызывается final .then().
Буду признателен за любое предложение относительно того, что я делаю неправильно. Спасибо.