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);
});
}
可能是什么问题。我正在使用异步和等待,但它不起作用。
解决方案
等待与承诺一起工作。你应该用 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)
}
});
});
}
推荐阅读
- nexus - 我们可以将 Nexus Repository Manager OSS 3.x 用作 Spinnaker 的 docker 注册表吗?
- amazon-web-services - 运行 1 小时后 ODBC/JDBC 连接中止?
- c++ - 尝试在 VS2015 中包含仅标头库(tiny-dnn)时出现编译错误
- angular - Angular 5 polyfill async/await 是否适用于 IE11
- android-9.0-pie - env(safe-area-inset-top) 在 Android Pie + WebView 69 上不起作用
- mysql - MYSQL 从组中获取总数
- apostrophe-cms - TypeError:无法读取未定义的属性“位图”(ApostropheCMS)
- xamarin.forms - 在 xamarin 表单中异步加载数据的正确方法
- c++ - c++中0-x和-x的区别
- apache-kafka - 卡夫卡流:java.nio.file.DirectoryNotEmptyException