2014-09-16 3 views
0

В следующем коде, я хотел бы, чтобы перезагрузить страницы SiteAdmin с функцией siteAdmin.reloadPages()только после того, как запасания страниц porperties CQ.form.SlingSubmitAction(dialog.form, config); выполняется успешно.Как вызвать функцию только после того, как выполнения другой функции укомплектовать закончил

следующая функция отправляет форму, а затем вызывает callback() функцию, которая, в свою очередь, перезагружает SiteAdmin страницы:

function foo(dialog, config, callback) { 
    var action = new CQ.form.SlingSubmitAction(dialog.form, config); 
    dialog.form.doAction(action); 
    dialog[dialog.closeAction](); 

    callback(); 
} 

вызов функции:

foo(dialog,action, function() { 
    var siteAdmin = CQ.Ext.getCmp(window.CQ_SiteAdmin_id); 
    siteAdmin.reloadPages(); 
}); 

Проблема заключается в том, что SiteAdmin страницы не отсылается после того, как страницаProperties (dialog.form) была успешно отправлена. Например, загруженный pageTitle - это старое значение.

Как перезагрузить сайт siteadmin только после того, как форма была успешно отправлена?

+0

Не 'doAction' взять саму функцию обратного вызова, когда он асинхронный? – Bergi

+0

Можете ли вы указать обратный вызов в 'config', или' doAction' принимает аргумент обратного вызова? – canon

ответ

2

Вы можете попытаться указать функцию успеха в конфигурации, как показано ниже.

function foo(dialog, config, callback) { 
    var action = new CQ.form.SlingSubmitAction(dialog.form, { 
     success: function(){ 
      var siteAdmin = CQ.Ext.getCmp(window.CQ_SiteAdmin_id); 
      siteAdmin.reloadPages(); 
     } 
    }); 
    dialog.form.doAction(action); 
    dialog[dialog.closeAction](); 
} 

Это обеспечит перезагрузку сайта siteadmin только после того, как запрос будет выполнен успешно.

Проверьте, имеются ли дополнительные параметры для вашего конфига here.

+0

спасибо, что это решение работает отлично :) – Ronald

-1

Я не вижу какого-либо теста на то, была ли успешная подача формы. Вы можете просто избежать вызова функции callback() до тех пор, пока не пройдете такой тест. Или вы можете поместить тест внутри функции callback(), а не выполнять перезагрузку страницы до тех пор, пока тест не будет пройден. ИЛИ, вы можете оценить, сколько времени потребуется для форм-представления, которые должны передаваться на веб-сервер, и как долго он принимает сервер для обработки данных, а затем сделать что-то вроде этого:

setTimeOut("callback();", 500); //wait 500 milliseconds (sample estimate) 

ИЛИ

setTimeOut("siteAdmin.reloadPages();", 500); //inside the callback() function 

Обратите внимание, что предполагается, что представленные данные всегда успешно обрабатываются, но использование setTimeout() - это, безусловно, общий способ гарантировать, что одна функция DONE, прежде чем будет вызвана другая функция.

+0

delying процесс с тайм-аутом - это не очень хорошая идея в моем случае :( – Ronald

+0

Возможно, мне следовало бы более четко рассказать о чем-то, если вы знаете, что для веб-сервера требуется 100 миллисекунд получать и обрабатывать предоставленные данные, вы можете указать тайм-аут в 100 миллисекунд, а не половинный тайм-аут, ожидаемый в моем предлагаемом ответе. У вас определенно есть встроенная задержка из-за природы сети, я говоря, что вы можете совместить ваш вторичный вызов функции с тем, чтобы быть в соответствии с этой задержкой (не вводить значительную дополнительную задержку). Проблема остается, однако, в том, что предлагаемый ответ предполагает, что представленные данные всегда действительны. – vernonner3voltazim

2

Вы должны вызвать функцию обратного вызова обув от успеха обратного вызова CQ.form.SlingSubmitAction

function foo(dialog, config, callback) { 
    var action = new CQ.form.SlingSubmitAction(dialog.form, 
     { 
     params: config.params, 
     success: function(frm, resp) { 
      callback(); 
     } 
     }); 
    dialog.form.doAction(action); 
    dialog[dialog.closeAction](); 
} 
+0

звучит как хорошая идея Я попробовал предложение rakhi4110, и он работает :) – Ronald

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