我需要从grpc响应中获取一些数据并返回该数据。我该如何等待数据准备就绪才能运行其余代码并返回数据?
我尝试放置一个while循环来等待函数的响应,但是它永远卡在那里。我需要更新一些全局变量,或者尝试捕获来自requestQueryTreeItemCommand函数的响应。
我知道我可能必须使用某种回调或Promise,但我只是不知道如何将其连接到此代码。
function queryTreeItem(elem) {
var requestQueryTreeItemCommand = new messages.QueryTreeItemRequest();
requestQueryTreeItemCommand.setItem(elem.textContent);
function queriedItemCallbackFunc(err, response) {
if (err) {
console.log(err);
responded = true;
response_str = "";
return response_str;
} else {
responded = true;
response_str = response.getMessage();
return response_str;
}
}
client.queryTreeItem(requestQueryTreeItemCommand, queriedItemCallbackFunc); // Requests stuff and calls queriedItemCallbackFunc when the other side responds back.
// while (!responded) {
// console.log("JS-DEBUG");
// console.log(responded);
// console.log(response_str);
// }
// While loop doesn't work, keeps looping forever.
// Somehow wait for queriedItemCallbackFunc to update the global variable 'response_str',
// or somehow capture the return of queriedItemCallbackFunc and don't use global variables.
responded = false;
return response_str;
}
答案 0 :(得分:1)
从根本上讲,不可能完全按照您的要求执行操作。 gRPC请求是异步操作,从函数返回是同步操作。从函数返回之前,您不能等待异步操作完成。
您可以使用async/await
来近似同步代码的代码外观,但这只会使问题更上一层楼。这样做会使queryTreeItem
异步,然后无论调用什么函数,都将遇到与您现在相同的问题。
这里唯一真正的解决方案是使用回调和/或promise和/或async/await
而不是返回值来处理异步操作的结果,从而以异步样式进行更广泛的编码。