2013-02-19 3 views
0

У меня есть простой jsonRpcService с методом, который возвращает true или false.Есть ли способ заставить jsonRpcService работать синхронно?

У меня есть кнопка с кодом на событиях CCJS и SSJS. Я хочу прекратить выполнение кода, если RPC вернет true, однако он выглядит, когда код запускается до того, как завершится добавление кода addCallBack и код в SSJS или выполняется

Есть ли способ подождать ответа addCallBack, прежде чем продолжить с любым другим CCSJ инструкции или SSJS-кода. Я ожидал, что return false остановит выполнение кода.

Вот мой код:

var lastupdate = '#{javascript:document1.getDocument().getLastModified().toString();}'; 
var myobject = rpcDocLock.checkUpdate(lastupdate); 
myobject.addCallback(function(modified){ 
    alert(modified); // #2 
    if (modified){ 
     alert("This document has been modified."); // #3 
     return false; 
    } 
}); 

alert("This alert is triggered and RPC has not finished its execution.") // #1 

Я добавил 3 предупреждения, так что вы можете увидеть порядок их запущенные.

+0

Просто переместите код, который должен быть выполнен после вызова в вашей функции * addCallBack *. –

+0

Я пробовал это @SvenHasselbach. Я добавил заявление еще в addCallback: 'myobject.addCallback (функция (модифицированную) { \t предупреждение (модифицированный); // # 2 \t если (модифицированный) { \t \t предупреждение (" Этот документ был изменен.«); // # 3 \t \t \t \t возвращение ложным; \t} еще { \t \t validateForm(); \t} });' Проблема моя кнопка имеет код также на SSJS, так это быть срабатывает независимо от того, что является результатом addCallback. Я хочу остановить любое выполнение кода, если возвращается метод RCP ** true ** – PSolano

+0

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

ответ

1

В вашей кнопки, добавьте следующие строки, чтобы получить контроль над о запросе Dojo XHR:

if(! dojo._xhr) 
    dojo._xhr = dojo.xhr; 

dojo.xhr = function (args, ioArgs, addArgs){ 
    ioArgs["sync"] = true; 
    return dojo._xhr(args, ioArgs, addArgs); 
} 

Это заставит все вызовы быть синхронизации (который блокирует браузер, отключает тайм-аут и т.д.) , Смотрите здесь больше: dojo.xhrGet supported object properties

Теперь вы можете позвонить вызов RPC:

var myobject = rpcDocLock.checkUpdate(lastupdate); 
myobject.addCallback(function(modified){ 

    // -=> RESET DOJO XHR CALL BACK FIRST! 
    dojo.xhr = dojo._xhr; 
    delete(dojo._xhr); 

    // -=> DO THE OTHER STUFF 
    alert(modified); // #2 
    if (modified){ 
     alert("This document has been modified."); // #3 
     return false; 
    } 
}); 

Я не уверен, что именно происходит, когда не удается вызов RPC, но это может остановить все CSJS (это синхронизируется).

+0

Это отличный @Sven RPC теперь синхронизирован; однако return false просто выходит из addCallback и его кода выполнения на SSJS. Мне пришлось назначить переменный результат внутри оператора if, а затем проверить его значение после addCallback: 'if (modified) { \t \t alert (" Этот документ был изменен. "); // # 2 \t \t result = false; \t \t return false; \t \t предупреждение («Это не должно отображаться»); // #? \t} 'Любые идеи, если можно остановить выполнение кода? – PSolano

+0

Да, в вашей кнопке создайте переменную: * var ret = true; * Затем измените значение переменной в вашей функции обратного вызова, если это необходимо (* ret = false *). Последняя строка кода в вашем CSJS возвращает * ret *. –

1

Вы никогда не должны писать код блокировки в веб-браузере, потому что, если бы браузер выглядел висевшим. Вот почему у вас есть функция обратного вызова, продолжайте там код, если вам нужно что-то получить с сервера.

У вас также есть событие onComplete, которое может быть запущено после обновления.

================================================================================================================================== ======= Редактировать

Это два способа решения проблемы.

  1. на стороне клиента с помощью функции обратного вызова переместить код SSJS на скрытую кнопку (с помощью CSS) Когда код функции заканчивается, и вы хотите, чтобы код SSJS пнуть в. Найти кнопку на ID и щелчок() на кнопке thru javascriptList item
  2. Переместить все в SSJS, и если документ будет изменен, возвратите сообщение об ошибке пользователю , используя специальный валидатор или проверите код для изменения и добавьте значение к переменной переменной, которая показать в вычисленном поле.
+0

Можете ли вы немного подробнее ваш ответ? Я возвращаю что-то с сервера (true, если документ был изменен и false, если документ не был изменен). Я не могу использовать onComplete, потому что у меня есть код также в событии SSJS, поэтому я хочу остановить выполнение кода, если addCallback возвращает true. Событие onComplete будет запущено после выполнения кода из CSJS и SSJS. – PSolano

+0

Спасибо @Fredrik за предложение; оба - отличные идеи. Тем не менее, я хочу повторно использовать этот код в разных действиях или кнопках на уровне Client Side, поэтому я пытался использовать элемент управления RPC. – PSolano

Смежные вопросы