Плагин Jquery-JSONP и отложенные объекты, не откладывая - PullRequest
0 голосов
/ 28 октября 2011

Я пытаюсь использовать плагин jQuery-jsonp с отложенными объектами jQuery, но пока мне не везет.

Цель состоит в том, чтобы вызвать API, получить данные и разработать их. Поскольку я использую один и тот же вызов для извлечения и разработки различных наборов данных для разных целей, я структурировал свой код таким образом, чтобы избежать явного повторения одного и того же вызова API в каждой функции разработки:

function callAPI(){
  return $getJSON(url);
}

function doStuff1(){
  $.when(callAPI)
  .then(function(data){
    //get the data and elaborate them for purpose #1
  })
}

function doStuff2(){
  $.when(callAPI)
  .then(function(data){
    //get a different set of data from same API
    // and elaborate them for purpose #2
  })
}

Проблема в том, что я попробовал тот же подход, заменив $ .getJSON () на $ .jsonp () из плагина Джулиана Оберга (http://code.google.com/p/jquery-jsonp/), но отсрочка не работает.

У меня есть несколько ограничений на это, и я не могу их изменить:

* Для вызовов API должен использоваться JSONP.

* Я должен быть в состоянии обнаружить ошибки (независимо от того, какого рода), поэтому использование плагина jQuery-jsonp, единственное решение, которое я нашел до сих пор.

Я изучал jQuery Deferred Object, искал форумы jQuery, Stackoverflow и глубины Интернета, и прочитал все на странице плагина. Я попробовал несколько подходов, но ни один из них не сработал (как будто отложенного даже не было). Моя гипотеза состоит в том, что deferreds не работают с плагином jquery-jsonp из-за его структуры (что позволяет ему отлавливать ошибки), а также потому, что $ .jsonp сам по себе не является отложенным, как $ .ajax, но я ни в коем случае не эксперт, поэтому мне нужен совет от этого великолепного сообщества.

Одно решение, которое я нашел, и оно работает для меня, - это передать функцию в качестве параметра функции callAPI, чтобы в случае успеха она могла выполнить то, что мне нужно, без повторения.

Так что моя функция callAPI будет изменена следующим образом:

function callAPI(func){
 $.jsonp({
   "url": url,
   "success": function(data) {
     func();
   },
   "error": function(d,msg) {
    //show error message
   }
 })
}

callAPI(doStuff1);
//or
callAPI(doStuff2);

Но, поскольку необходимость управления ошибками возникла на поздней стадии разработки, и я, будучи новичком, раньше не думал об этом, это означало бы переписать целую кучу кода. Так что если кому-то удастся использовать deferreds с плагином jquery-jsonp, это было бы здорово знать.

Спасибо всем.

Флавия

1 Ответ

1 голос
/ 09 марта 2012

Я думаю, это то, что вы хотите.Вы должны сопоставить внутренний API jQuery-jsonp с вызывающими методами отложенного объекта.

function callAPI(url){
  return $.Deferred(function(dfd) {
    $.jsonp({
      url: url
      ,success: dfd.resolve
      ,error: dfd.reject
      ,complete: dfd.always
    });
  }).promise();
}

Тогда вы сможете использовать

$.when(callAPI('url #1'), callAPI('url #2'))
  .done(function(response1, response2) {
    // each response will be [ json , STR_SUCCESS ] based on Jquery-jsonp's API
    var json1 = response1[0];
    ...
  })
  .error(function(error1, error2) {
    // each response will be [ xOptions , type ] based on Jquery-jsonp's API
    ...
  })
;
...