Grails远程函数onSuccess与onComplete



我有以下Grails代码:

${remoteFunction(controller: 'myController', 
action: 'myMethod',
params: 'params',
onSuccess: 'mySuccessMethod(data);',
onComplete: 'myCompleteMethod();',
update: 'divName')};

我希望:

  • mySuccessMethod()myCompleteMethod()在Ajax调用完成时各被调用一次

我得到的是

  • mySuccessMethod()被立即调用一次
  • Ajax调用(最终)完成时
    • mySuccessMethod()被称为第二次
    • myCompleteMethod()被调用(一次)

在查找这个问题时,Ajax建议使用onsuccess,但Grails中的实现(即调用它时)似乎有所不同。

有人能解释一下吗。

  • 为什么mySuccessMethod()被调用两次
  • 这是否意味着我们应该使用onComplete而不是onSuccess,至少在Grails中是这样

(编辑:添加以下信息作为对附加信息请求的响应。)

remoteFunction()调用生成的HTML如下(为了可读性,我添加了CR和空格):

jQuery.ajax({type:'POST',data:paramString,
url:'/<appname>/myController/myMethod',
success:function(data,textStatus){
jQuery('#divName').html(data);
mySuccessMethod(data);;
},
error:function(XMLHttpRequest,textStatus,errorThrown){
},
complete:function(XMLHttpRequest,textStatus){
myCompleteMethod();
}
});;

mySuccessMethod的控制台日志包含以下数据:

  • 第一次呼叫:

    <div class="loading-content"/>
    
  • 第二次通话:

    <The actual expected response>
    

谢谢。

onComplete将在每次ajax调用结束时调用,即使调用成功或失败或任何更新。但是onSuccess在成功时被调用。这意味着你不能用onComplete代替onSuccess

请注意,从jQuery1.5开始,底层ajax方法名称已经更改:

  • success()现在是done()
  • error()现在是fail()
  • complete()现在是always()

有了Grails 3,现在必须直接使用jQuery.ajax,所以这些新名称很重要。

最新更新