【问题标题】:Is it possible to specify context in callback of a jsonp Ajax call?是否可以在 jsonp Ajax 调用的回调中指定上下文?
【发布时间】:2013-09-30 01:48:22
【问题描述】:

是否可以在 jsonp Ajax 调用的回调中指定我们的特定上下文?

我发现这样做的唯一方法是指定回调名称但不实现它,因此回调进入带有所需上下文的成功方法:

    $.ajax({
        type: "GET",
        url: 'someurl',
        dataType: 'jsonp',
        jsonpCallback: 'myCallbackName',
        context: this,
        success: function (response) {
                   console.log(this); //this must be the context specified earlier
        }
    });

问题是即使它正在工作,我也会收到很多错误:

TypeError: myCallbackName 不是函数

知道如何在不导致错误的情况下实现这一点吗?

谢谢

艾蒂安

【问题讨论】:

  • 为什么上下文如此重要?为什么不能将this 存储在另一个变量中?我不明白为什么你不能不使用 jsonpCallback 并且仍然使用上下文。我的猜测是 'someurl' 没有返回有效的 jsonp。
  • 尝试在函数调用中添加.call(context, arguments)
  • 我在不同的上下文中多次触发这个 ajax,在另一个变量中管理上下文似乎有点复杂......
  • 正如问题中提到的,ajax 调用返回有效的 jsonp,因为一切正常......问题是我这样做的方式有点 hacky,因为我指定了一个回调函数没有实现强制回调成为成功方法......所以我想摆脱的唯一问题是错误消息......
  • 你为什么要指定一个不存在的回调呢?它不会强迫成功的方法。如果您没有指定回调,则会调用成功方法。所以只需将上下文保存在全局变量中并编写回调函数即可。

标签: jquery ajax jsonp


【解决方案1】:

这应该可以解决问题:

$.ajax({
    type: "GET",
    url: 'someurl',
    dataType: 'jsonp',
    jsonpCallback: 'myCallbackName',
    context: this,
    success: delegate(this, function (response) {
        console.log(this); //this must be the context specified earlier
    })
});

var delegate = function(context, func) {
    return function() {
        return func.apply(context, arguments);
    }
}

但是,您会得到 TypeError: myCallbackName is not a function,因为您没有定义 myCallbackName。只需添加

var myCallbackName  = function() { }

附: 更多关于 JavaScript 中的委托here

【讨论】:

  • 我解决了我的问题,创建了一个不执行此处建议的函数...在我的情况下,委托的东西不是必需的。
【解决方案2】:

可以在 JavaScript 中通过在调用末尾附加 .call([context],[arguments]...) 来设置上下文。比如……

console.log.call(window, this)

该选项将修复任何Illegal Invocation 错误,并有多种其他形式,例如.bind().apply()

如果您只是想隐式保存较早的this,您的第二个选择是将其保存到变量中。保存它的好时机是在 AJAX 调用之前,但要确保它是全局的。我不确定你为什么不只使用提供的成功函数,因为它会提供数据。

var _this = this;
$.ajax(...);

function myCallbackName() {
   console.log(_this);
} 

【讨论】:

  • 但是对导致错误的 myCallbackName 回调的调用是由 jQuery 自己作为 jsonp 机制的一部分完成的……我自己没有触发它……我应该把它放在哪里。调用(...)?
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多