簡體   English   中英

JSONP ajax請求和jQuery.when()

[英]JSONP ajax request and jQuery.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);

但是沒有運氣。

有任何想法嗎?

我在jsFiddle中測試了您發布的代碼“按原樣”並且即使JSONP調用失敗也可以正常工作(當然,由於example.com/endpoint查詢,請求返回404錯誤)。

所以我想我在$.ajax章節的jQuery文檔中找到了您問題的答案:

服務器應返回將JSON響應傳遞到回調函數中的有效JavaScript $ .ajax()將執行返回的JavaScript,並調用JSONP回調函數,然后將響應中包含的JSON對象傳遞給$ .ajax()成功處理程序。

檢查您的JSONP返回的JS代碼是否有效,並檢查您的控制台中是否沒有語法錯誤,該錯誤會停止您這邊的JS代碼執行(並阻止always執行功能)。

編輯:我轉載了您的錯誤。 當使用jQuery 2.x(edge)時 ,它的工作原理與預期的相同(請嘗試 )。 傳遞給jQuery 1.x(edge)時 ,這兩種方法都可以正常工作,但always不會調用函數func( 在那兒嘗試 )。 我所有的測試都是在Google Chrome瀏覽器下完成的。

setTimeouts在JS的全局范圍內,並且您在函數內部創建了變量ajax。 嘗試

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

在定義var ajax的函數內部,然后將method1_timeout提供給setTimeout作為回調。

setTimeout(method1_timeout, 5000);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM