Я использую Edmunds API SDK для получения информации о транспортном средстве для одного из моих проектов, и у меня есть функция, которая отображает результаты, как только изображение автомобиля будет отображаться. Таким образом, отображение результата происходит после вызова ajax для получения изображения. У меня есть настройка Ajax вызова следующим образом:Сделайте что-нибудь после завершения ajax-звонка
self.getCarPic = function() {
// Optional parameters
var options = { "styleId" : $options.val() };
// Callback function to be called when the API response is returned
function success(res) {
for(var i in res){
// Looking for the front view shot of the car
if (res[i].shotTypeAbbreviation === "FQ") {
url = "http://media.ed.edmunds-media.com" + res[i].photoSrcs[res[i].photoSrcs.length-1];
break;
}
// If its not available, get whatever they have on the api
else {
url = "http://media.ed.edmunds-media.com" + res[0].photoSrcs[res[i].photoSrcs.length-1];
}
}
// If there is no image at all just return the default car pic
if (! url) {
url = defaultPic;
}
}
// If an error occurs just set the url to default car pic
function fail(data) {
url = defaultPic;
}
// Fire the API call
res.api('/v1/api/vehiclephoto/service/findphotosbystyleid', options, success, fail);
};
И у меня есть другие настройки функции для отображения результата следующим образом:
self.getResult = function() {
var x = self.getCarPic;
$.when(x).done(function(){
// display result code
}
};
Это не кажется, работает, потому что функция отображения запускается на выполнение до AJAX вызов завершается. Я знаю, что getCarPic должен быть объектом обещания, но как мне это сделать, когда я использую SDK Edmunds? Я не могу использовать глобальные функции, такие как ajaxComplete, потому что я не хочу, чтобы это мешало другим вызовам ajax, которые у меня есть.
Похоже, что 'self.getCarPic' не является объектом обещание, но только регулярная функция. Вот почему код не работает. –
Пусть ваш 'getCarPic' принимает параметр функции - это было бы вашим обещанием. 'getCarPic' может затем выполнить вашу функцию, когда api преуспеет. – Jasen
Я смотрю на код, похоже, что их SDK использует jsonp для вызова (который не обрабатывает объекты обещаний и т. Д.). Обратите внимание, как они обрабатывают ошибки в типичном режиме «тайм-аута». Я бы рекомендовал просто обрабатывать вещи в рамках вашей функции успеха. –