2011-12-22 7 views
2

ループ内でgetJSON()コールのバッチを実行しています。getJSONエラーハンドラとその原因となったクエリを関連付ける方法

呼び出しが成功すると、返されるJSONにはループカウンタと同じ値が含まれますが、エラーハンドラが呼び出されたときにどのクエリが原因であるかを調べる方法が見つからないようですカウンターは失敗したコールのために持っていた)。

var p; 
for (p = 1; p <= pagecount; p++) { 
    var params = { 
    page:  p, 
    pagesize: 100 
    }; 

    $.getJSON("http://api.travel.stackexchange.com/1.1/tags?jsonp=?", 
    params, 
    function(data) { 
     /* I can use data.page to know the value of page in the query */ 
    } 
).error(function(jqXHR, textStatus, errorThrown) { 
    /* how can I find the value "page" had in the query? */ 
    }); 
} 
+0

成功コールバックでは、返されたJSONの一部ですので、** data.pageにしかアクセスできません。** –

+0

@MДΓΓБДLL:そうです。しかし、閉鎖、文脈、これ、または.ajax()では動作しますが、同様の質問をブラウズすることから.getJSON()で動作するものではなく、運がないところからでも取得する方法が必要です。 – hippietrail

答えて

4

各エラーコールバックのため閉鎖生成します。代わりに$アヤックスへ

function errorHandler(page) { 
    return function (jqXHR, textStatus, errorThrown) { 
     console.log(page); // it works 
    }; 
} 

for (var p = 1; p <= pagecount; p++) { 
    var params = { 
     page: p, 
     pagesize: 100 
    }; 

    $.getJSON("http://api.travel.stackexchange.com/1.1/tags?jsonp=?", 
       params, 
       function(data) { 

    }).error(errorHandler(p)); 
} 
+0

これはDavidの答えよりもはるかに簡単ですが、両方を理解したいのですが... – hippietrail

+0

これは動作しますが、なぜ私は 'p' 'errorHandler(p)'にありますが、直接そこで使うことはできません。 – hippietrail

+0

@hippie:コードは '.error(errorHandler)'とは言いません。実際にエラーが発生したときではなく、 'getJSON'リクエストが*開始されたときに' errorHandler'が呼び出されます。エラーが発生すると、 'errorHandler'が返す*関数が呼び出されます。呼び出しが* made *のときに 'p'が' errorHandler'に渡されるので、反復ごとに異なる値を持ちます。さて、この異なる値は 'error'コールバックが呼び出されるコンテキストの一部を構成します。 –

2

あなたは、常に各反復でparams用クロージャを作成することができます。

var p; 
for (p = 1; p <= pagecount; p++) { 
    var x = { 
    page:  p, 
    pagesize: 100 
    }; 

    (function(params) { 
    return function() { 
     $.getJSON("http://api.travel.stackexchange.com/1.1/tags?jsonp=?", 
      params, 
      function(data) { 
      /* I can use data.page to know the value of page in the query */ 
      } 
     ).error(function(jqXHR, textStatus, errorThrown) { 
      /* how can I find the value "page" had in the query? */ 
     }); 
    }; 
    })(x); 

} 

別の解決策は、あなたがparamsに設定することができcontext性質を持っていること、ajax()getJSONから切り替えることであろう。その場合、paramsオブジェクトにはエラーコールバックでthisという名前でアクセスできます。

context: params, 
error: function(xhr, status, errorThrown) { 
    alert(this.pagesize); 
} 
+0

私はこの構文が.ajax()を使って同様の質問で使われているのを見たことがありますが、 '')(x)をぶら下げてしまうのはとても難しいです; '.getJSON ()case) - : – hippietrail

+0

@hippie:すべてのことは、新しい関数を返します。ここでは、 'params'オブジェクトのインスタンスごとに新しいクロージャが作成されます。それを周り遊んで、それは非常に便利です。しかし私はあなたがもっと役に立つと思う別のアプローチで私の答えを更新しました。 –

+0

Ahaはい私は同様の質問で 'context/this'アプローチを読んでいて、.ajax()のように.getJSON()から利用できないかもしれないと思った。 – hippietrail

2

スイッチ、およびbeforeSendハンドラでjqXHRオブジェクトにプロパティを追加します。次に

$.ajax({ 
    url : "http://api.travel.stackexchange.com/1.1/tags?jsonp=?", 
    dataType : "jsonp", 
    data : params, 
    success : your_success_function, 
    error : your_error_function, 
    beforeSend : function(jqXHR) { 
     jqXHR.originalData = params; 
    } 
}); 

エラーハンドラのjqXHR.originalDataを介してデータにアクセスできます。

+1

+1 'ajax'に切り替えると、私はこれが私の' context'オプションよりも好きです。 –

+0

これはもう必要ありません。 – andig

関連する問題