【发布时间】:2017-07-11 15:32:30
【问题描述】:
最近我使用$.post() 方法将一堆AJAX 调用抽象为一个函数。我的想法是使用$.post() 返回的jqXHR 对象添加标准错误处理程序等(通过.fail() .done() .always())来删除代码重复。然后我想我可以将 jqXHR 对象从方法返回到原始调用函数,这样我就可以添加额外的处理程序来执行更多特定于上下文的事情。
但是,返回的jqXHR 对象似乎是原始对象的副本,而不是对象本身。因此,它的状态永远不会被原始调用更新,因此我的其他 .done() 函数都不会被执行。
是否可以在 JS 中返回对对象的引用?我有C++背景,那么有没有办法模仿JS中的“返回指向对象的指针”功能?
我知道这里有关于 pass-by-reference/value 的讨论,但我找不到专门处理 Deferred 对象的讨论
编辑:示例代码
function AJAX(url,data,onSuccess) {
var jqxhr = $.post({url,data});
jqxhr.done(onSuccess);
jqxhr.fail(displayError());
return jqxhr;
}
...
function example() {
var dfrd = AJAX("example.php",data,successFunc);
dfrd.done(alert("Hello, World!"));
}
AJAX 函数中的.done() 和.fail() 正常执行,但example() 中的.done() 永远不会执行,因为dfrd.state() 始终是pending
【问题讨论】:
-
您能否编辑问题以包含您的代码。如果逻辑正确,您尝试做的事情当然是可能的。
-
您是否确认至少有一个预期的
.done()调用正在解析?您不会仅通过在 JS 中返回/传递对象来获得副本,因为所有变量都作为引用类型处理。 -
添加了骨架代码以显示我正在尝试做的事情,很抱歉最初没有添加它
-
除了不将回调作为函数传递之外,这段代码(
return部分)应该可以工作。 -
这与pass-by-reference/value无关,是关于调用函数。不,延迟并没有什么特别之处,它们只是对象。这些总是参考值,没有语法会复制它们的内容。
标签: javascript jquery jquery-deferred