首页 > 解决方案 > 等待异步方法的结果

问题描述

我正在尝试从 for 循环调用异步方法,但它不会等待该方法的结果。

下面是我的代码:

async function fetchActivityHandler (req, reply) {
        esClient.search({
            index: 'user_activity',
            type: 'document',
            body: {
                _source : ["userId","appId","activity","createdAt","updatedAt"],
                query: {

                    bool : {
                        must:[
                        {match : { 'userId': req.params.id }}
                        ]
                    }

                }
            }
        },async function (error, response, status) {
            if (error){
                console.log('search error: '+error)
            }
            else {
                var activities = [];
                    //await Promise.all(response.hits.hits.map(async function(hit){
                    for (const hit of response.hits.hits) {
                        var activity = hit._source
                        var app = await fetchAppDetails(activity.appId);

                        console.log(app);
                        activity = {...activity,app : app}
                        activities.push(activity);
                        console.log(activity);
                }
                reply.status(200).send(activities);
            }
        });
    }

    async function fetchAppDetails (appId) {
        esClient.get({
            index: 'app',
            type: 'document',
            id: appId
        }, function (err, response) {
            console.log(response._source);
            return (response._source);
        });
    }

可能是什么问题。我正在使用异步和等待,但它不起作用。

标签: node.js

解决方案


等待与承诺一起工作。你应该用 promise 包装你的函数来完成这项工作。希望这会帮助你。此外,您不需要在 fetchActivityHandler 函数上使用异步。仅在您已经使用过的回调中。

function fetchAppDetails (appId) {
return new Promise((resolve,reject)=>{
    esClient.get({
        index: 'app',
        type: 'document',
        id: appId
    }, function (err, response) {
        if(err){
            reject(err);
        }
        else{
            resolve(response)
        }

    });
  });   
 }

推荐阅读