等待异步方法的结果

时间:2019-01-24 04:49:49

标签: node.js

我正在尝试从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);
        });
    }

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

1 个答案:

答案 0 :(得分:1)

等待充满希望。您应该将函数包装为可以完成这项工作的承诺。希望这会帮助你。另外,您无需在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)
        }

    });
  });   
 }