JSONP ajax request and jQuery.when()

JSONP ajax request and jQuery.when()

本文关键字:when jQuery and ajax request JSONP      更新时间:2023-09-26

我必须进行一堆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);

可惜运气不好。

任何想法?

我在jsFiddle中测试了你发布的代码'as-is',即使JSONP调用失败(当然,请求返回404错误,因为example.com/endpoint查询)。

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

服务器应该返回传递JSON的有效JavaScript响应到回调函数。$.ajax()将执行返回JavaScript,调用JSONP回调函数将响应中包含的JSON对象传递给$.ajax()成功处理程序。

检查你的JSONP返回的JS代码是否有效,检查你的控制台是否有任何语法错误,这会阻止你的JS代码在你的一边执行(并防止always函数被执行)。

编辑:我复制你的错误。当使用jQuery时x (edge),它像预期的那样工作(尝试那里)。传递给jQueryx (edge),两个方法调用都在工作,但always函数从未被调用(尝试在那里)。我所有的测试都是在Google Chrome下完成的。

settimeout在JS的全局作用域中,您在函数中创建了变量ajax。试着

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

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

setTimeout(method1_timeout, 5000);