javascript вызывает DataSnap REST, и браузер не отвечает

Использую Delphi XE7. Когда мой Javascript вызывает мою серверную функцию, которой требуется около 800 мс для чтения датчика и возврата данных, браузер не отвечает с момента, когда я нажимаю кнопку для вызова Javascript, пока он, наконец, не вернется. Я использую Javascript по умолчанию, сгенерированный прокси-сервером var serverMethods().getChannel(i); для вызова моей серверной функции.

Вызов Javascript выглядит так:

var s = serverMethods().getChannel(i);
      serial[i].$sensorlValue.text(s.result.fields.sensorString);
      serial[i].$sensorlRealValue.text(s.result.fields.sensor);
      serial[i].$sensorStatus.text(s.result.fields.sensorStatus+' '+s.result.fields.name);
      serial[i].$sensorError.text(s.result.fields.sensorError);
      serial[i].$AVString.text(s.result.fields.AVString);
      serial[i].$AVError.text(s.result.fields.AVError);

Итак, по умолчанию в примере нет обратных вызовов или обещаний Javascript, поэтому embaracaderom каким-то образом блокирует выполнение Javascript до тех пор, пока ответ не вернется, и изменяет значения приема?

Я думаю о том, чтобы попробовать использовать вызов jQuery Ajax для URL-адреса, но есть ли другое решение?

Поскольку serverMethods генерируется из прокси, но для $ ajax мне нужно вручную установить каждый из них. А может я тут что-то не так делаю и serverMethods можно использовать без блокировки?

Спасибо.


person Toni Tabak    schedule 20.06.2015    source источник
comment
Не будь умником, я знаю, что это проблема JS на стороне браузера, и она всегда связана с сервером delphi, потому что он генерирует этот JS на стороне клиента и генерирует его с примером, который работает таким образом, поэтому он когда-либо работал с delphi, потому что он дает этот код из прокси-генератора.   -  person Toni Tabak    schedule 20.06.2015


Ответы (1)


Я нашел решение этой проблемы после исследования пути выполнения в ServerFunctionExecutor.js, который вызывается на serverMethods (). SOMEAPIFUNCTION () 1. Справка и документация равны 0, а вопросы google + XE7 равны 0. Итак, если кто-то из embaracadero прочитает этот PLS СДЕЛАТЬ ДОСТОЙНУЮ ДОКУМЕНТАЦИЮ.

ServerFunctionExecutor.js в строке 263

   //async is only true if there is a callback that can be notified on completion
var useCallback = (callback != null);
request.open(requestType, url, useCallback);

if (useCallback)
{
  request.onreadystatechange = function() {
    if (request.readyState == 4)
    {
      //the callback will be notified the execution finished even if there is no expected result
      JSONResult = hasResult ? parseHTTPResponse(request) : null;
      callback(JSONResult, request.status, owner);
    }
  };
}

Таким образом, возможно и НЕ ДОКУМЕНТОВАНО использовать обратный вызов для разблокировки графического интерфейса. Используйте это как:

serverMethods().SOMEAPIFUNCTION(par1,par2,.... callback)

Если у вас есть метод сервера, определенный в коде delphi, например, с 3 параметрами в js, четвертым параметром является обратный вызов:

Для этого примера код теперь выглядит так:

 serverMethods().getChannel(i,function(a,b,c){
            serial.$sensorlValue.text(a.result[0].fields.sensorString);
            serial.$sensorlRealValue.text(a.result[0].fields.sensor);
            serial.$sensorStatus.text(a.result[0].fields.sensorStatus+' '+s.result.fields.name);
            serial[i].$sensorError.text(a.result[0].fields.sensorError);
            serial[i].$AVString.text(a.result[0].fields.AVString);
            serial[i].$AVError.text(a.result[0].fields.AVError);
          });

a - ответ JSON
b - статус запроса под номером 200 или что-то еще
c - обычно владелецi undefined

person Toni Tabak    schedule 20.06.2015