API Call в Rocket.Chat Интеграция - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь расширить мост 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'
        };
    }
}

Документация Meteor гласит:

// 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 ]

0 голосов
/ 05 ноября 2018

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

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

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

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

0 голосов
/ 04 ноября 2018

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

...