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 调用。 它不应该被 GrailsremoteFunction
调用两次。页面上发生了其他事情。你能发布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 事件没有被调用?