Мне нужно получить некоторые данные из ответа grpc и вернуть эти данные. Как я могу дождаться готовности данных, чтобы запустить остальную часть моего кода и вернуть данные?
Я попытался разместить цикл while, чтобы дождаться ответа функции, но он просто застрял там навсегда. Мне нужно либо обновить некоторые глобальные переменные, либо попытаться получить ответ от функции requestQueryTreeItemCommand.
Я знаю, что, вероятно, должен использовать какой-то обратный вызов или обещание, но я просто не знаю, как подключить его к этому коду.
function queryTreeItem(elem) {
var requestQueryTreeItemCommand = new messages.QueryTreeItemRequest();
requestQueryTreeItemCommand.setItem(elem.textContent);
function queriedItemCallbackFunc(err, response) {
if (err) {
console.info(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.info("JS-DEBUG");
// console.info(responded);
// console.info(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;
}
В принципе, невозможно сделать именно то, о чем вы просите здесь. Запрос gRPC — это асинхронная операция, а возврат из функции — синхронная операция. Вы не можете ждать завершения асинхронной операции перед возвратом из функции.
Вы можете аппроксимировать внешний вид синхронного кода, используя async/await
, но это просто поднимет проблему на один уровень выше. Это сделало бы queryTreeItem
асинхронным, и тогда любая функция, вызывающая его, имела бы ту же проблему, что и сейчас.
Единственное реальное решение здесь — кодировать более широко в асинхронном стиле, используя обратные вызовы и/или промисы и/или async/await
вместо возвращаемых значений для обработки результатов асинхронных действий.
Вы просто не можете сделать это таким образом. Вместо этого вы должны установить всплывающую подсказку в обратном вызове из запроса gRPC.
Да, в итоге я сделал это, вручную показав/скрыв всплывающую подсказку при обратном вызове из запроса gRPC.
К сожалению, проблема в том, что мне нужно возвращаемое значение, потому что я должен вернуть его обратно в
$(".tabulator-cell").tooltip({title: function(){return queryTreeItem(this);}, trigger: "hover", delay: {show: 250, hide: 250}});