Как дождаться ответа grpc в javascript

Мне нужно получить некоторые данные из ответа 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;
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 475
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

К сожалению, проблема в том, что мне нужно возвращаемое значение, потому что я должен вернуть его обратно в $(".tabulator-cell").tooltip({title: function(){return queryTreeItem(this);}, trigger: "hover", delay: {show: 250, hide: 250}});

tgonzalez89 10.04.2019 17:29

Вы просто не можете сделать это таким образом. Вместо этого вы должны установить всплывающую подсказку в обратном вызове из запроса gRPC.

murgatroid99 10.04.2019 18:30

Да, в итоге я сделал это, вручную показав/скрыв всплывающую подсказку при обратном вызове из запроса gRPC.

tgonzalez89 18.04.2019 15:23

Другие вопросы по теме