如何将getJSON错误处理程序与导致它的查询相关联

时间:2011-12-22 14:36:03

标签: jquery error-handling 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? */
  });
}

3 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分: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);

}

另一种解决方案是从getJSON切换到ajax(),其具有context属性,您可以将其设置为params。在这种情况下,您可以在错误回调中以params的形式访问this对象。

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

答案 2 :(得分:2)

切换到$ .ajax,并在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访问数据。