Виды событий - Сценарии ExtSdk2

Материал из razgovorov.ru
Перейти к: навигация, поиск

При работе с модулем ExtSdk2 Вы можете получить ряд событий. Информация из событий варьируется в зависимости от типа пришедшего сообщения. Это может быть успешное как успешное выполнение метода, так и ошибка. Предложенные события в этой статье приходят при вызове методов ReadAllObject и ReadAllXml2. Рекомендуем ознакомиться с видами событий и их обработкой ниже в статье.

Примеры ответов от модуля

Событие Message

Ответ такого типа содержит в себе результат работы вызываемого метода по переданному queryID при синхронной работе с плагином. Поле 'Result' содержит результат работы метода.

{
  'type': 'Message',
  'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5',
  'data': {
    'Result': ...,
    'Stat': ...
    }
  }
}

Событие Error

Событие типа Error приходит когда при вызове метода происходит ошибка. Данные об ошибке лежат в поле 'data'.

{
  'type': 'Error',
  'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5',
  'data': {
    'code': ...,
    'detail': ...,
    'dump': {},
    'message': ...,
    'method_name': 'ExtSdk2....',
    ...
  }
}

Событие Error #ASYNC

Событие типа Error #ASYNC приходит когда при вызове асинхронного метода необходимо сообщить пользователю, что метод начал асинхронную работу и необходимо ждать одно из событий Event #ASYNC. Данные об ошибке лежат в поле 'data'. Такую ошибку можно легко отличить от других по ключевому слову '#ASYNC' в поле 'detail'.

{
  'type': 'Error',
  'queryID': 'b3e310ec-7d85-4026-bfad-228690f38d55',
  'data': {
    'code': 308,
    'detail': '#ASYNC',
    'dump': {},
    'message': 'Ожидайте загрузки документа',
    'method_name': 'ExtSdk2.WriteDocumentEx',
    'stack': [
      {
        'method_name': 'AsyncUploadAttachments b3e310ec-7d85-4026-bfad-228690f38d55'
      }
    ]
  }
}

Событие Event

Данный ответ от плагина можно получить при взаимодействии с плагином. Например при подключении к плагину, где в объекте ответа в поле 'eventName' лежит 'connected'.

{
  'type': 'Event',
  'data': {
    'channelName': 'SbisPluginEvent',
    'eventName': 'connected',
    'type': 'object',
    'data': ...
  }
  'queryID': '15e79572-b1be-4dc2-a0e9-3652ecb187c5'
}

События Event #ASYNC

Событие extsdk2.async.complete

Данное событие приходит при успешном выполнении асинхронного метода. Это можно понять по полю 'eventName' со значением 'extsdk2.async.complete'. Идентификатор ответа следует смотреть в поле 'QueryId'.

{
  'type': 'Event',
  'data': {
    'channelName': 'SbisPluginEvent',
    'eventName': 'extsdk2.async.complete',
    'type': 'object',
    'data': {
      'QueryId': '4fb98709-0264-4e01-a0aa-e4d30b4b65a7',
      'Result': {...},
      'Stat': {...}
    }
  }
}


Событие extsdk2.async.error

Данное событие приходит при не успешном выполнении асинхронного метода. Это можно понять по полю 'eventName' со значением 'extsdk2.async.error'. Идентификатор ответа следует смотреть в поле 'QueryId'.

{
  'type': 'Event',
  'data': {
    'channelName': 'SbisPluginEvent',
    'eventName': 'extsdk2.async.error',
    'type': 'object',
    'data': {
      'QueryId': '4fb98709-0264-4e01-a0aa-e4d30b4b65a7',
      'Error': {...}
    }
  }
}


Событие extsdk2.async.progress

Данное событие приходит при длительном выполнении асинхронного метода. Это можно понять по полю 'eventName' со значением 'extsdk2.async.progress'. Идентификатор ответа следует смотреть в поле 'QueryId'. В поле 'Progress' можно увидеть прогресс выполнения метода в процентах.

{
  'type': 'Event',
  'data': {
    'channelName': 'SbisPluginEvent',
    'eventName': 'extsdk2.async.progress',
    'type': 'object',
    'data': {
      'QueryId': '4fb98709-0264-4e01-a0aa-e4d30b4b65a7',
      'Progress': {...}
    }
  }
}

Обработка событий

После вызова команд ReadAllObject и ReadAllXml2 события приходят в виде единой строки, содержащей массив событий. Их следует разобрать в привычный вид массива и работать с каждым отдельно. Если ожидаемого ответа нет, то следует позвать метод ReadAllObject или ReadAllXml2 еще раз. Для обработки большого количества ответов рекомендуется вызывать данные методы в цикле с некоторым интервалом в 100-500мс, чтобы не нагружать систему. Если у вашей системы нет метода ожидания для интервального вызова, то рекомендуется использовать метод Sleep. Он позволит приостановить работу на нужное количество миллисекунд.

Пример работы, если ожидается ответ на условно 5 вызванных ранее методов, queryID которых записаны в массив requests. В итоге должен получиться массив result с 5 элементами.

   size_requests = len(requests)
   result = []
   while requests != 0:
      json_string = ole.ReadAllObject()
      events = json.loads(json_string)

      for event in events:
         # Превращение event в необходимый вид. Предоставляется пользователю.
         current_event = parseEvent(event)

         query_id = current_event['queryID']
         
         # Обрабатываем события которые ждём
         query_id = event['queryID']
         if query_id in requests:
            result.append(self.pars_event(event))
            requests.remove(query_id)

      # Если мы получили не все ответы и необходимо подождать 500мс
      if len(result) != size_requests:
         ole.Sleep(500)