Несмотря на то, что я могу передать обещание как параметр в функцию ошибки, он не запускает функцию & error на вызывающем абоненте.?
если я изменил код, чтобы включить функцию AJAXError в строку, все работает нормально.
Можно ли обойти обещание в качестве параметра и по-прежнему иметь возможность запускать обратно тогда и терпеть неудачу на вызывающем абоненте в цепочке.
ПРИМЕЧАНИЕ: обещание возвращается из palletizerService.addSerialNumberToPallet, но разрешено/отклонено в другой функции AjaxFailed.
palletizerService.addSerialNumberToPallet ('p1','s1')
.then( function (response){
console.log('success');
},
function(error){
console.error(error);
});
Ниже приведена служба, которую я вызываю из приведенного выше кода.
palletizerService.addSerialNumberToPallet = function (palletID, serialNumber) {
var deferred = $q.defer();
$.ajax({
url: url,
type: "GET",
dataType: "json",
methodName: methodName,
deferred: deferred.promise,
data: "palletID=" + palletID + "&serialNumber=" + serialNumber,
timeout: 20000, // 20 seconds for getting result, otherwise error.
error: AjaxFailed,
complete: function (jqXHR, textStatus) {
console.log("Ajax-finally : " + methodName);
},
beforeSend: function (qXHR, settings) {
},
success: function (data, textStatus, jqXHR) {
console.log("Ajax-Sucess " + methodName);
deferred.resolve(data);
}
});
return deferred.promise;
};
Это внешняя функция
function AjaxFailed(qXHR, textStatus, errorThrown) {
try {
console.error('Ajax-Error in ' + methodName, qXHR.status, qXHR.responseText);
} catch (e) {
console.log("LocalMethod-Error in " + methodName);
console.error(e);
}
finally {
this.deferred.reject(qXHR);
}
}
Ваша проблема в том, что вы передаете обещание как свойство .deferred
объекта ваших опций. Вы не можете разрешать/отклонять обещания, у них .reject
метода .reject
(и ваш код должен бросаться при попытке вызвать его). Вместо этого вам нужно будет передать deferred
объект, который вы держите.
Тем не менее, это плохая идея. Поскольку jQuery.ajax
уже возвращает обещание, вы должны просто ассимилировать его с помощью $q.when
:
function (palletID, serialNumber) {
return $q.when($.ajax({
…
}));
}
(вы сможете опустить все success
и обработчики errror
, угловое обещание позаботится о них, если вы хотите добавить преобразования или протоколирование, выполните те обещания).
Тем не менее, что все еще не оптимально, на самом деле вряд ли есть причина использовать jQuery.ajax
вообще. Просто используйте Angular $http
service, который сразу же возвращает угловое обещание.
$http
который уже возвращает обещание$q
. Вы путаете библиотеки обещаний и создаете анти-паттерн. Обещание jQuery отличается от вашего$q.defer