Grails 远程函数 onSuccess 与 onComplete

Posted

技术标签:

【中文标题】Grails 远程函数 onSuccess 与 onComplete【英文标题】:Grails Remote Function onSuccess vs onComplete 【发布时间】:2014-03-29 21:06:30 【问题描述】:

我有以下 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>

谢谢。

【问题讨论】:

@dmahapatro:我不明白你的评论。你说的相关联是什么意思?这不是 try/catch/finally 问题。这是一个 Grails 包装的 jQuery/Ajax 调用。 它不应该被 Grails remoteFunction 调用两次。页面上发生了其他事情。你能发布remoteFunction调用生成的HTML吗? @aldrin:我在上面添加了生成的 HTML。谢谢。 谢谢。生成的代码看起来很好。页面中的其他东西肯定在调用该方法吗? @aldrin:非常感谢。你的问题帮助我找到了原因。当我看到上面第一次调用的数据时,它让我意识到“加载内容”类是我们项目内部的一个 CSS 类。事实证明,有人添加了代码来拦截 Ajax 调用,并将此响应作为中间进程注入以显示微调器。鉴于问题出现在我正在处理的项目内部,我应该如何处理这个 Stack Overflow 问题?自己回答?将问题关闭为无效?你想回答,我会接受吗?再次感谢。 【参考方案1】:

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

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

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

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

【讨论】:

您在此处描述的行为是 jQuery Ajax 代码所说的。然而,这不是我在 Grails 中看到的行为。这就是我上面描述的问题。 onSuccess 在成功完成之前立即被调用,并在成功完成时被再次调用。所以我不能使用onSuccess。我的问题是为什么? 我的回答仍然适用于您的第二个问题。如果你使用 onComplete,它会在任何更新后调用,我猜它不是你的目标。 我同意你所说的,但问题是那不是我上面描述的行为。为什么 onSuccess 被调用了两次,一次甚至在它成功完成之前?我该如何解决? 我将此解决方案标记为正确,因为它是正确的,而实际问题出在我自己的项目中。请参阅上面与@aldrin 的讨论。感谢所有评论的人。

以上是关于Grails 远程函数 onSuccess 与 onComplete的主要内容,如果未能解决你的问题,请参考以下文章

Cordova:如何将多个 onSuccess 值解析为函数

为啥我的 indexedDB.open.onsuccess 事件没有被调用?

grails远程表单,多次提交,使用javascript

Ajax.BeginForm,调用操作,返回 JSON,如何在 OnSuccess JS 函数中访问 JSON 对象?

Grails远程分页正在刷新整个页面而不是div

Ajax.BeginForm 不执行OnSuccess