如何在JavaScript中等待grpc响应

时间:2019-04-09 21:34:36

标签: javascript asynchronous grpc

我需要从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;
}

1 个答案:

答案 0 :(得分:1)

从根本上讲,不可能完全按照您的要求执行操作。 gRPC请求是异步操作,从函数返回是同步操作。从函数返回之前,您不能等待异步操作完成。

您可以使用async/await来近似同步代码的代码外观,但这只会使问题更上一层楼。这样做会使queryTreeItem异步,然后无论调用什么函数,都将遇到与您现在相同的问题。

这里唯一真正的解决方案是使用回调和/或promise和/或async/await而不是返回值来处理异步操作的结果,从而以异步样式进行更广泛的编码。