Как ждать результатов подзапроса в узле js? - PullRequest
1 голос
/ 12 ноября 2019

Я использую Graphql с MongoDB. Использовал подзапрос в resolver, но при выполнении основного запроса подзапроса возвращаемые данные не дожидались завершения подзапроса. Я хочу обработать основной запрос, используя параметры подзапросов в resolver.

  return  await Articles.find({ Status: 1, isPublish : true  })
      .sort({TotalClapCount:-1})
      .sort({ViewCount:-1})
      .skip( offset )
      .limit(limit)
      .then( async ( lor ) => { await
       lor.forEach(async function(data, key){
          data["isBookmark"] =  
                  await ArticleBookmarks
                  .find({ ArticleID : data["ID"], UserID : ArgsUserID, Status : 1 })
                  .countDocuments()
                  .then( (hre) =>{return (hre == 1) ? true : false; });
      );
    });
    return  lor;
});

Я хочу отобразить список статей с закладкой в ​​одном запросе, но return lor выполняется до того, какоперация подзапроса. Как async-await работает для этого?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

forEach() не будет ждать завершения асинхронного оператора. Вы можете использовать для цикла с await внутри. Однако, недостатком является то, что другие операторы должны ждать завершения предыдущего. Подходящим решением является использование Promise.all, которое возвращает одно Обещание, которое разрешается, когда все обещания, переданные как итеративные, разрешены. Надеюсь, это поможет.

0 голосов
/ 12 ноября 2019

попробуйте, как показано ниже

let MainFunction = () => {
    return new Promise(async (resolve, reject) => {
        try {
            let async = require("async");
            let query = {
                Status: 1,
                isPublish: true
            }
            let sortOptions = {
                TotalClapCount: -1,
                ViewCount: -1
            }
            let Data = await Articles.find(query).sort(sortOptions).skip(offset).limit(limit).lean();
            async.eachSeries(Data, async (data, callback) => {
                try {
                    let cquery = {
                        ArticleID: data["ID"],
                        UserID: ArgsUserID, Status: 1
                    };
                    let countedArticles = await ArticleBookmarks.countDocuments(cquery).lean();
                    data.isBookmark = (countedArticles >= 1) ? true : false;
                    callback();
                } catch (error) {
                    callback(error);
                }
            }, async (err) => {
                if (err) reject(err);
                resolve(Data);
            });
        } catch (error) {
            console.error(error);
            reject(error);
        }
    });
}


return await MainFunction();

Примечание. Пожалуйста, передайте необходимые параметры в MainFunction в зависимости от необходимости.

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