9

JQuery $.ajax を使用して一連の JSON URL をループし、結果を配列にダウンロードしています。一部の URL は 404 を返します。これは、div メッセージとして処理および表示しています。

ただし、URL を渡すことができないようです。より正確には、常に配列の最後の URL のみを渡します。

これは、ajax が非同期であり、完了するまでに時間がかかるためだと思いますが、現在の JSON URL (または変数) のみが SUCCESS または ERROR に表示されていることを確認する方法が他にわかりません

私のコード:

 // 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>")
                    }
                });
4

2 に答える 2

13

これが1つの方法です。コールバック オプションを使用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 コメントに基づいて、$.ajax APIから直接取得した以下を認識することが重要です

リモート サーバーからデータを取得する場合 (スクリプトまたは jsonp データ型を使用した場合のみ可能)、エラー コールバックとグローバル イベントは決して発生しません。

于 2012-06-25T23:16:00.887 に答える
0

サーバーから URL を返すことをお勧めします。疑似 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>");  
}
于 2012-06-25T23:01:43.023 に答える