2012-06-25 80 views
9

我正在使用JQuery $ .ajax遍歷一組JSON URL並將結果下載到數組中。一些URL返回404 - 我正在處理&顯示爲div消息。將變量傳遞給jQuery ajax成功或錯誤函數

但是,我似乎無法通過URL,更確切地說,它總是隻傳遞數組中的最後一個URL。

我認爲這是因爲AJAX是異步的,需要更長的時間來完成,但我不知道怎麼回事,以確保只有當前JSON的URL(或變量)正在顯示成功或錯誤的

我的代碼:

// For every URL loop through 'baseitems' array 
for (var i = 0; i < baseitems.length; i++) { 

    // This is where I'm hoping to store the current URL as a variable to pass to the end-user on Success or Error 
    var caturl = baseURL + "/" + baseitems[i]; 

    // Get the data via JSON 
    $.ajax({ 
    type: "GET", 
    url: caturl, 
    dataType: "json", 
    async: true, // set so that the variables caturl get updated below 
    success: function (result) { 
     // Success: store the object into catalog array 
     cat.unshift(result); 
     $('#showdata').prepend("Loaded: " + caturl + "</br>"); // still buggy here - probably async JSON issue 
    }, 
    error: function (xhr, textStatus, error) { 
     // Error: write out error 
     console.log(xhr.statusText); 
     console.log(textStatus); 
     console.log(error); 
     $('#showdata').prepend("ERROR : '" + error + "' trying to access: " + caturl + "</br>"); // still buggy here - probably async JSON issue 
    } 
}); 

}

**更新:工作代碼**

與@charlietfl幫助+一些很好的事情完成的工作代碼就像下面的成功/錯誤代碼+加載的URL的數量一樣。感謝charlietfl &調解人!

   $.ajax({ 
        type: "GET", 
        url: caturl, 
        dataType: "json", 
        async: true, // set so that the variables caturl get updated below 
        beforeSend: function (jqXHR, settings) { 
         /* add url property and get value from settings (or from caturl)*/ 
         jqXHR.url = settings.url; 
        }, 
        success: function (result, textStatus, jqXHR) { 
         // Success: store the object into catalog array 
         var url = jqXHR.url; 
         cat.unshift(result); 
         $('#showdata').prepend("<font size=\"1\">Loading: " + url + " status: " + textStatus + "</font></br>"); 
         successcount += 1; 

        }, 
        /* error to be deprecated in jQuery 1.8 , superseded by "fail" */ 
        error: function (jqXHR, textStatus, error) { 
         var url = jqXHR.url; 
         /* replace caturl with url in your append */ 
         $('#showdata').prepend("<font size=\"1\" color=\"red\">ERROR : '" + error + "' trying to access: " + url + "</font></br>"); 
        }, 
        complete: function (jqXHR, textStatus) { 
         $('#showdata').prepend("<font size=\"3\">Loaded <b>" + successcount + "</b> of " + baseitems.length + " total catalogs.</font></br>") 
        } 
       }); 
+0

您是否曾嘗試在caturl的ajax調用中將'caturl'的值傳遞給函數,然後將結果傳遞回來? 或者,因爲你已經知道服務器的URL,你通過它回到了阿賈克斯成功'result'並使用它有 – peacemaker

回答

13

這是一種方法。 beforeSend回調選項可讓您訪問jqXHR對象和ajax設置對象。

您將無法在錯誤追加中使用caturl,因爲它不會與請求拋出錯誤同步。

$.ajax({ 
    /* url, data ...& other opts*/ 
    beforeSend:function(jqXHR, settings){ 
     /* add url property and get value from settings (or from caturl)*/ 
     jqXHR.url= settings.url; 
    }, 
    /* error to be deprecated in jQuery 1.8 , superseded by "fail" */ 
    error: function(jqXHR, , textStatus, error){ 
     var url=jqXHR.url; 
    /* replace caturl with url in your append */ 
    $('#showdata').prepend("ERROR : '" + error + "' trying to access: " + url + "</br>"); 
    } 

編輯:基於第三方API的意見,它recognze當數據從遠程服務器(這是唯一可能使用腳本或檢索在從$.ajax API

直取是非常重要的jsonp數據類型),錯誤回調和全局事件永遠不會被觸發。

+0

感謝您提供建議的代碼。它向我指出了正確的方向,並通過一些小小的調整得到了解決。 – NikG

+0

很好奇...是跨域調用..但你得到錯誤觸發? – charlietfl

+0

是,錯誤被觸發精 - 不過,我在這一點上本地運行的代碼。注意它沒有使用JSONP(沒有回調函數),但似乎至少在本地工作 – NikG

0

我建議剛好路過URL回從服務器,在pseduo-PHP它會像:

function function_called_by_ajax() 
{ 
    //processing... 

    echo json_encode(array('urlString'=>$urlString)); 

} 

現在,在你的Ajax成功你可以得到的字符串,東西像這個僞js:

success: function (result) { 
    var caturl = result.urlString; 
    // Success: store the object into catalog array 
    cat.unshift(result); 
    $('#showdata').prepend("Loaded: " + caturl + "</br>"); 
} 
+0

很難通過從服務器的URL回來時,AJAX失敗,OP希望錯誤的URL – charlietfl

+0

我管不着通過服務器並從服務器傳回URL。我正在閱讀第三方JSON API。 – NikG