expressjs不会等到查询完成

时间:2017-08-25 03:17:51

标签: express asynchronous elasticsearch

我使用expressjs从elasticsearch检索数据并发送回前端的角度应用程序。目前我遇到了一个问题,因为expressjs不会等到查询执行完成。我搜索了一个解决方案,社区说使用"承诺或同步"。但我无法弄清楚我应该在哪里使用它。我试图使用它,但我收到错误。

这是我从前端收到请求并调用elasticsearch查询以发送响应的地方。

init

这是查询elasticsearch的功能。

api.post('/clsDependencies', (req, res) => {
  classDependencies(req.body.className);
  res.json(messages);
});

预期数据初始化为我尝试发送回前端的变量(消息)。但是,在发送响应时,变量不会被初始化。在将数据发送回前端之前,我应该等待查询执行完成。

修改

消息是在两个函数之外定义的。

function classDependencies(csName) {
let body = {
size: 20,
from: 0,
query: {
  match: {
    ClassName: {
      query: csName
    }
  }
}
};
search('testclass', body)
.then(results => {
results.hits.hits.forEach((hit, index) => hit._source.dependencies.forEach(
  function(myClass){
    messages.push({text: myClass.methodSignature , owner: `\t${++nmb} - 
 ${myClass.dependedntClass}`});
  }))})
 .catch(console.error);
 };

2 个答案:

答案 0 :(得分:0)

Javascript解释器没有"阻止"当你进行异步调用时。这与Express完全无关。

您对search()的来电是非阻止性的,因此当它正在进行时,classDependencies()会返回,其余代码会继续运行。这是Javascript中异步调用的工作方式。

如果您想在完成res.json()时致电classDependencies(),请从其中返回承诺,并在该承诺结算时致电res.json()

你可以这样做:

api.post('/clsDependencies', (req, res) => {
  classDependencies(req.body.className).then(messages => {
      res.json(messages);
  }).catch(err => {
      res.status(500).send(something here);
  });
});

function classDependencies(csName) {
    let body = {
        size: 20,
        from: 0,
        query: {
            match: {
                ClassName: {
                    query: csName
                }
            }
        }
    };
    return search('testclass', body).then(results => {
        let messages = [];
        results.hits.hits.forEach((hit, index) => hit._source.dependencies.forEach(function(myClass) {
            messages.push({
                text: myClass.methodSignature,
                owner: `\t${++nmb} - ${myClass.dependedntClass}`
            });
        }));
        // make messages be the resolved value of the returns promise
        return messages;
    }).catch(function(err) {
        // log the error, but keep the promise rejected
        console.error(err);
        throw err;
    });
};

答案 1 :(得分:0)

api.post('/clsDirectory', (req, res) => {
  classDependency(req.body.className, res);
});


function classDependency(csName, cb) {
let body = {
size: 20,
from: 0,
query: {
  match: {
     ClassName: {
      query: csName
    }
  }
}
};
search('testclass', body)
.then(results => {
results.hits.hits.forEach((hit, index) => 
hit._source.dependencies.forEach(
  function(myClass){
    messages.push({text: myClass.methodSignature , owner: `\t${++nmb} - 
 ${myClass.dependedntClass}`});
  }));
  cb.json(messages);
 })
 .catch(console.error);
 };