API Call в Rocket.Chat Интеграция

Я пытаюсь расширить мост telegram-rocket.chat и для этого нужно вызвать apis. Для этого rocket.chat предоставляет оболочку Meteor.js с именем HTTP.

Этот фрагмент кода представляет собой исходящий хук, который обрабатывает сообщение, отправленное пользователем, позволяет мне преобразовать сообщение и передать измененный текст.

Prepare_outgoing_request({request}) вызывается хуком rocket.chat, и я хотел бы вызвать в нем API, который разрешает коды смайликов в соответствии с действующим символом смайликов: ":see_no_evil: to "

/** Global Helpers
 *
 * console - A normal console instance
 * _       - An underscore instance
 * s       - An underscore string instance
 * HTTP    - The Meteor HTTP object to do sync http calls
 *           https://docs.meteor.com/api/http.html
 */


class Script {
    request_emojitext(emoji_code) {
       console.log(`called: request_emojitext('${emoji_code}')`);
       const url = `https://www.emojidex.com/api/v1/emoji/${emoji_code}`;
  
       const response = HTTP.call('GET', url);

       console.log(`Emoji Response: ${response.constructor.name} => ${JSON.stringify(response)}`);
      // Emoji Response: Object => {"error":{}}             
       return response;
    }
  
    /**
     request.params            {object}
      request.method            {string}
     request.url               {string}
     request.headers           {object}
     */
    prepare_outgoing_request({ request }) {
       const emojiResponse = this.request_emojitext('see_no_evil');
       const emojiCharacter = emojiResponse.content.emoji;
        
        return {
          // https://core.telegram.org/bots/api
          url: `${request.url}&text=${emojiCharacter}`,
          method: 'GET'
        };
    }
}

В документации Метеора говорится, что:

// Asynchronous call
Meteor.call('foo', 1, 2, (error, result) => { ... });

// Synchronous call
const result = Meteor.call('foo', 1, 2);

/*
On the client, if you do not pass a callback and you are not 
inside a stub, call will return undefined, and you will have 
no way to get the return value of the method. That is because
the client doesn’t have fibers, so there is not actually any 
way it can block on the remote execution of a method.
*/

Я не уверен, как действовать дальше, поскольку мне пока не совсем комфортно с асинхронным программированием. Как бы я заблокировал, пока результат не станет фактически доступен, или есть другой способ сделать это, которого я полностью пропускаю?

2 ответа

Решение

Я обнаружил проблему, посмотрев на реализацию переменной HTTP ( PR # 5876). Кроме того, был открыт запрос функции для асинхронных вызовов ( выпуск № 4775).

const response = HTTP('GET', 'https://www.emojidex.com/api/v1/emoji/sweat_smile');

Это выполняет вызов API синхронно и возвращает объект результата:

{
  "result": {
    "statusCode": 200,
    "headers": {
      // ...
    },
    "data": {
      "code": "sweat smile",
      "moji": "",
      // ...
    }
  }
}

Если вы хотите увидеть полный код, вы можете проверить его на Git

Как сказано в документации, на клиенте нет способа заблокировать - браузеры просто не реализуют никакого механизма для этого. Таким образом, вопрос в том, что мешает вам справиться с задержкой на клиенте до вызова обратного вызова. Разумеется, типичным шаблоном является переключение клиента в какое-то состояние "ожидания" при выполнении вызова (например, показ счетчика), а затем обновление страницы с результатом при срабатывании обратного вызова (и скрытие счетчика).).

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