Mongoose eachAsync: порядок выполнения обещаний неожиданный

#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().

Буду признателен за любое предложение относительно того, что я делаю неправильно. Спасибо.