【问题标题】:How to modify jQuery's ajax() result Deferred when using context objects使用上下文对象时如何修改jQuery的ajax()结果延迟
【发布时间】:2016-03-30 04:24:46
【问题描述】:

我正在迁移到 jQuery 1.8 并将我的 ajax 结果处理程序从 success:error: 更改为 done()fail()。 但是,在我的 done() 处理程序中,我开始收到类似

的错误
this.each is not a function

虽然 ajax 调用和以前一样包含context: 参数。不知何故,this 上下文消失了。

这是调用代码:

function vzload(args) {
    return $.ajax(args).then(function(json) {
        if (json.exception) {
            var e = new Exception(json.exception.type, args.url + ':<br/><br/>' + json.exception.message);
            vz.wui.dialogs.exception(e);
            return $.Deferred().reject();
        }
        return $.Deferred().resolve(json);
    });
}

这是发生错误的时候:

var deferred = vz.load({
    controller: 'capabilities',
    context: someobject
}).done(function(json) {
    this.each(...)
});

我已尝试将分辨率更改为:

return $.Deferred().resolveWith(this, json);

现在错误是

TypeError: json is undefined

使用上下文对象时修改ajax结果Deferred的正确方法是什么?

【问题讨论】:

  • I'm migrating to jQuery 1.8 and changing my ajax result handlers from success: and error: to done() and fail() 您不需要需要这样做 - successerror 仍然完全有效。另外,如果你正在升级 jQuery,为什么不去 1.x 分支上的最新版本呢?
  • @Rory 我需要一种方法来根据 json 响应内容将成功结果修改为失败 - Deferreds 似乎是实现这一目标的“正确”(也是唯一?)方法。
  • 只需将处理错误的功能提取到它自己的函数中,这样您就可以在满足条件时从errorsuccess 调用它。
  • @andig:不管罗里怎么说,你是对的
  • 为什么需要在回调中使用this?为什么不直接打电话给someobject.each?似乎是最好的方法 (but there are alternatives if you want)

标签: jquery promise


【解决方案1】:

哦,亲爱的。似乎我在这两种情况下都犯了同样的错误。根据https://api.jquery.com/deferred.resolveWith/,该函数需要args 作为一个数组,而不是一个简单的参数。只有在第一种情况下,这个错误甚至在未定义 json 之前就被失败覆盖了。

所以“正确”的方式似乎是:

return $.Deferred().resolveWith(this, [json]);

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多