Mongoose eachAsync: порядок выполнения обещаний неожидан - PullRequest
0 голосов
/ 02 апреля 2019

Я использую библиотеки mongoose 5.4.20, запрос 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;
    }

Мангуст:

    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( 'А').Я ожидал, что .eachAsync () будет ждать разрешения обещания, затем извлекает следующий документ из коллекции и т. Д., И только в самом конце, когда все обещания разрешены, финальный .then ()называется.

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

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