Я пытаюсь использовать плагин 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, это было бы здорово знать.
Спасибо всем.
Флавия