【问题标题】:Javascript return reference to jqXHR from functionJavascript 从函数返回对 jqXHR 的引用
【发布时间】: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


【解决方案1】:

所以这是一个时间问题。

看起来,对于多个.done() 函数,当函数接收到来自$.post() 调用的响应时,会出现轻微延迟。因此,传递给AJAX 函数的onSuccess(resp) {} 将在alert() 之后执行。我用来测试的特定 onSuccess 函数中有一个页面刷新调用,它会在我看到它之前关闭警报。

我有C++背景,所以我想我需要升级我的JS测试程序。

感谢所有评论的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2014-08-09
    • 2022-11-24
    相关资源
    最近更新 更多