Как связать обработчик ошибок getJSON с запросом, вызвавшим его - PullRequest
2 голосов
/ 22 декабря 2011

Я выполняю серию вызовов 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 ]

4 голосов
/ 22 декабря 2011

Создание закрытия для каждого обратного вызова ошибки:

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));
}
2 голосов
/ 22 декабря 2011

Вместо этого переключитесь на $ .ajax и добавьте свойство к объекту jqXHR в обработчике beforeSend:

$.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 в обработчике ошибок.

2 голосов
/ 22 декабря 2011

Вы всегда можете создать замыкание для 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);
}
...