2012-06-25 20 views
9

JQuery $ .ajaxを使用して、一連のJSON URLをループし、結果を配列にダウンロードします。いくつかのURLは404を返します。私は&をdivメッセージとして表示しています。変数をjQuery ajaxの成功関数またはエラー関数に渡す

しかし、私はURLを渡すように見えません。より正確には、常に配列内の最後のURLだけを渡します。

私は私のコード

SUCCESSまたはERRORに示されている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 
    } 
}); 

}

** UPDATE:WORKING CODE **

@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

ajax呼び出しでcaturlの関数に 'caturl'の値を渡してみましたが、結果に戻してみましたか? また、あなたはすでにサーバー上のURLを知っているので、それをajaxの成功 '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>"); 
    } 

EDIT:サードパーティのAPIのコメントに基づいて、データがスクリプトを使用してのみ可能である(リモートサーバから取得された場合ストレート$.ajax API

から行われる以下のrecognzeすることが重要ですかjsonpデータ型)、エラーコールバックとグローバルイベントは決して発生しません。

+0

提案されたコードをありがとうございます。それは正しい方向に私を指摘し、少し微調整して解決しました。 – NikG

+0

好奇心が強いです...クロスドメインコールです...しかし、エラートリガを取得していますか? – charlietfl

+0

はい、エラーが発生していますが、現時点でコードをローカルで実行しています。 JSONP(コールバック関数なし)を使用していないことに注意してください。しかし、少なくともローカルでは動作しているようです – NikG

0

私は同じように、それはなるだろうpseduo-PHPで、サーバーから戻ってURLを渡すことをお勧めしたい:あなただけの文字列を取得することができ、あなたのAjaxの成功で今

function function_called_by_ajax() 
{ 
    //processing... 

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

} 

、何かこの擬似jsのように:

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

ajaxが失敗し、OPがエラーURLを望むときにサーバーからURLを戻すのが難しい – charlietfl

+0

私はコントロールできませんサーバー上でURLをサーバーから戻します。私はサードパーティのJSON APIから読んでいます。 – NikG