JSONP ajax请求和jQuery.when()

时间:2014-07-16 06:45:00

标签: javascript jquery ajax jsonp .when

我必须进行一堆JSONP调用,并在完成(或失败)后执行一些代码。

即:

function finished() {
    alert('done!');
}

function method1() {
    return $.ajax('http://example.org/endpoint', {
        data: {
            foo: 'bar'
        },
        dataType: 'jsonp'
    });
}

function method2() {
    return $.ajax('http://example.org/endpoint', {
        data: {
            baz: 'qux'
        },
        dataType: 'jsonp'
    });
}

$.when(method1(), method2()).always(finished);

唯一的问题是,如果任何请求失败,将不会调用finished()

我可以尝试检测其中一个ajax调用是否会失败:

function method1() {
    var method1_timeout = setTimeout(function() {
        // this call has failed - do something!
    }, 5000);

    var ajax = $.ajax('http://example.org/endpoint', {
        data: {
            foo: 'bar'
        },
        dataType: 'jsonp',
        success: function() {
            clearTimeout(method1_timeout);
        }
    });

    return ajax;
}

但我仍然坚持这一点 - 我如何告诉延迟对象该特定的ajax请求失败了?

我尝试调用ajax对象的error()方法:

var method1_timeout = setTimeout(function() {
    ajax.error();
}, 5000);

但没有运气。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我测试了您发布的代码'原样'在jsFiddle中它可以工作,即使JSONP调用失败(当然,请求因example.com/endpoint查询而返回404错误)。

所以我认为我在jQuery文档中找到了问题的答案,在$.ajax章节中:

  

服务器应返回传递JSON的有效JavaScript   响应回调函数。 $ .ajax()将执行   之前返回JavaScript,调用JSONP回调函数   将响应中包含的JSON对象传递给$ .ajax()   成功经纪人。

检查您的JSONP返回的JS代码是否有效,并检查您的控制台中是否有任何语法错误,这将停止执行您的JS代码(并阻止always功能待执行)。

编辑:我转载了您的错误。使用 jQuery 2.x(边缘)时,它的工作方式与预期的(try there)相同。传递到 jQuery 1.x(边缘),两个方法调用正在工作,但永远不会调用always func(try there)。我的所有测试都是在谷歌浏览器下完成的。

答案 1 :(得分:-1)

setTimeouts在JS的全局范围内,您在函数内创建了变量ajax。试试

var method1_timeout = function(){ ajax.error();}

在您定义var ajax的函数内部,然后将method1_timeout作为回调提供给setTimeout。

setTimeout(method1_timeout, 5000);