IBM Worklight 5.0.6.1 - выполнение onFailure и onSuccess в Client.connect() и invokeProcedure() НЕ является исключительным при тайм-ауте?

Мы наблюдаем удивительный сценарий, когда у нас медленное сетевое соединение, и время ожидания наших вызовов к серверу WL истекает.

Это происходит в WL.Client.connect, а также в invokeProcedure:

  • выполняем вызов с таймаутом 10 секунд
  • сетевое соединение медленное, поэтому время ожидания вызова истекает
  • определенная процедура onFailure, связанная с этим вызовом, выполняется
  • сервер WL отвечает действительным ответом после тайм-аута
  • выполняется процедура onSuccess, связанная с этим вызовом

Является ли это разработанным и предполагаемым поведением WL Client Framework? Это указано в документации InfoCenter или где-то еще?

Все разработчики в нашей команде ожидали, что эти две процедуры будут взаимоисключающими, и наш код был реализован на основе этого предположения. Сейчас мы изучаем варианты того, как сопоставить ответ с истечением времени ожидания/сбой с успешным ответом, чтобы убедиться, что мы достигаем эксклюзивного выполнения кода/логики onFailure или onSuccess в нашем приложении.

Примечание. Мы не проверяли это с помощью connectOnStartup=true, а поскольку initOptions не предоставляет процедуру onSuccess (поскольку WL обрабатывает ее внутри), может быть еще сложнее реализовать монопольное выполнение в этом случае.


person christianmenkens    schedule 11.09.2013    source источник


Ответы (1)


Это похоже на ожидаемое поведение, но не цитируйте меня по этому поводу.

Вы можете получить желаемое поведение (вызывать обратный вызов ошибки только в случае сбоя и только вызывать обратный вызов успеха в случае успеха), используя jQuery.Deferreds. Существуют способы создания этих отложенных объектов с помощью dojo и другие библиотеки. Но я только что протестировал реализацию jQuery, которая поставляется с каждой версией IBM Worklight.

$(function () {

var WL = {};
WL.Client = {};
WL.Client.invokeProcedureMock = function (options) {
  options.onFailure('failure');
  options.onSuccess('success');
};

var dfd = $.Deferred();

var options = {
  onSuccess: dfd.resolve,
  onFailure: dfd.reject
};

WL.Client.invokeProcedureMock(options);

dfd
  .done(function (msg) {
    // handle invokeProcedure success
    console.log(msg);
  })
  .fail(function (msg) {
    //handle invokeProcedure failure
    console.log(msg);
  });

});

Я поместил приведенный выше код в JSFiddle, обратите внимание, что даже если я вызову обратный вызов onSuccess, он не будет никакого эффекта, потому что я уже вызвал обратный вызов отказа (который отклонил отложенный). Вы должны добавить логику своего приложения в блоки .done или .fail.

Это всего лишь предложение, вероятно, есть много способов решить вашу проблему.

person cnandreu    schedule 11.09.2013