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

时间:2013-09-24 17:44:43

标签: jquery ajax jsonp

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

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

    $.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不是函数

如何在不造成错误的情况下实现这一目标?

由于

艾蒂安

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

$.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不是函数,因为您没有定义 myCallbackName 。只需添加

var myCallbackName  = function() { }

P.S。 有关JavaScript here中的委派的更多信息。

答案 1 :(得分:0)

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

console.log.call(window, this)

该选项可以解决所有Illegal Invocation错误,并提供各种其他类型的错误,例如.bind().apply()

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

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

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