Как ждать ответа grpc в javascript - PullRequest
0 голосов
/ 10 апреля 2019

Мне нужно получить некоторые данные из ответа 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 Ответ

1 голос
/ 10 апреля 2019

По сути, здесь невозможно сделать именно то, что вы просите.Запрос gRPC является асинхронной операцией, а возврат из функции является синхронной операцией.Вы не можете дождаться завершения асинхронной операции, прежде чем вернуться из функции.

Вы можете приблизительно аппроксимировать внешний вид кода синхронного кода, используя async/await, но это только поднимет проблему на один уровень вверх.В этом случае queryTreeItem будет асинхронным, и тогда любые вызовы функций вызовут ту же проблему, что и у вас сейчас.

Единственное реальное решение здесь - это более широкий код в асинхронном стиле с использованием обратных вызовов и / илиобещания и / или async/await вместо возвращаемых значений для обработки результатов асинхронных действий.

...