Как выполнить несколько запросов mongoose асинхронно и подождать, пока все они не завершатся, перед отправкой ответа? - PullRequest
0 голосов
/ 07 декабря 2018

Заранее спасибо, но кто-нибудь может мне объяснить, как я могу выполнить разные запросы для каждого свойства моего запроса?Я пытаюсь создать меню боковой панели поиска, когда пользователь изменяет значения флажков, я создаю объект со следующими свойствами:

    {
      "category": [
        "electronics",
        "clothing",
        "pets"
      ],
      "condition": [
        "old",
        "new"
      ]
    }

Я хочу вставить запрос в массив функций, а затем выполнить их с помощью асинхронного.Параллельно При вызове я хочу отправить результат каждого запроса в один массив, содержащий результат всех запросов.

router.get('', async function(req,res)
{
    var searchResults = [];
    if(req.query.filters)
    {

        const queryObj = JSON.parse(req.query.filters);
        var searchQueries = [];
        if(queryObj.category){
            searchQueries.push(async function (cb) {
                return await Rentals.find({/* SOME CONDITION */}).populate('-something').exec(function (err, docs) {
                    if (err) {
                        throw cb(err);
                    }

                    cb(null, docs);
                });
            })    
        }

        if(queryObj.condition){
            searchQueries.push(async function (cb) {
                return await Rentals.find({/* SOME CONDITION */}).populate('-something').exec(function (err, docs) {
                    if (err) {
                        throw cb(err);
                    }

                    cb(null, docs);
                });
            })    
        }


        async.parallel(searchQueries, function(err, foundRentals) {
            if (err) {
                throw err;
            }
            searchResults.push(foundRentals[0]); // result of searchQueries[0]
            searchResults.push(foundRentals[1]); // result of searchQueries[1]
            searchResults.push(foundRentals[2]); // result of searchQueries[2]

        })
    }
    res.json(searchResults);
});

Проблема возникает при возврате searchResults, однако я получаю пустой массив с сервера, однако послеответ был отправлен, запросы завершены, и я получаю результат ПОСЛЕ ответа был отправлен.Как я могу выполнить все запросы одновременно и подождать, пока все они не завершатся, прежде чем отправлять ответ клиенту?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Я решил, используя этот синтаксис

let finalResults= await Promise.all(arrayToIterate.map(async(value) => { // map instead of forEach
                    const result = await getRentalsByQuery({query} );
                    finalValue = result;
                    return finalValue; // important to return the value
                }));
0 голосов
/ 07 декабря 2018

Ваша версия кода promise.all будет выглядеть примерно так:

router.get('', async function(req,res)
{
    try{
        let searchResults = [],
            categoryPromises = [],
            conditionPromises = [];

        if(req.query.filters)
        {

            const queryObj = JSON.parse(req.query.filters);
            if(queryObj.category && queryObj.category.length > 0){
                categoryPromises = queryObj.category.map(singleCategory=>{
                    return Rentals
                        .find({/* SOME CATEGORY? */})
                        .populate('-something')
                        .exec();
                });   
            }

            if(queryObj.condition && queryObj.condition.length > 0){
                conditionPromises = queryObj.category.map(singleCondition=>{
                    return Rentals
                        .find({/* SOME CONDITION */})
                        .populate('-something')
                        .exec();
                });   
            }

            searchResults.push(await categoryPromises);
            searchResults.push(await conditionPromises);

        }
        res.json(searchResults);
    }catch(e){
        // catch-all error handling here
    }
});

(вместо .map вы также можете использовать цикл for для помещения их в массив categoryPromises)

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