Grails远程函数onSuccess与onComplete

时间:2014-02-26 19:38:21

标签: jquery ajax grails grails-2.0

我有以下Grails代码:

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

我希望:

    当Ajax调用完成时,
  • mySuccessMethod()myCompleteMethod()将被调用一次

我得到的是

  • 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>
    

感谢。

1 个答案:

答案 0 :(得分:4)

每次ajax调用结束时,

onComplete都会调用,即使它成功或失败或任何更新。但是onSuccess在成功时被调用。这意味着您无法使用onComplete代替onSuccess

请注意 - 从jQuery 1.5开始 - 底层的ajax方法名称已更改:

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

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