我使用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);
};
答案 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);
};