Передача Promise в качестве параметра не вызывает то или не вызывает обратные вызовы

0

Несмотря на то, что я могу передать обещание как параметр в функцию ошибки, он не запускает функцию & 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);
}

}
  • 3
    Было бы гораздо разумнее использовать $http который уже возвращает обещание $q . Вы путаете библиотеки обещаний и создаете анти-паттерн. Обещание jQuery отличается от вашего $q.defer
Теги:
promise
angular-promise

1 ответ

0

Ваша проблема в том, что вы передаете обещание как свойство .deferred объекта ваших опций. Вы не можете разрешать/отклонять обещания, у них .reject метода .reject (и ваш код должен бросаться при попытке вызвать его). Вместо этого вам нужно будет передать deferred объект, который вы держите.

Тем не менее, это плохая идея. Поскольку jQuery.ajax уже возвращает обещание, вы должны просто ассимилировать его с помощью $q.when:

function (palletID, serialNumber) {
    return $q.when($.ajax({
         …
    }));
}

(вы сможете опустить все success и обработчики errror, угловое обещание позаботится о них, если вы хотите добавить преобразования или протоколирование, выполните те обещания).

Тем не менее, что все еще не оптимально, на самом деле вряд ли есть причина использовать jQuery.ajax вообще. Просто используйте Angular $http service, который сразу же возвращает угловое обещание.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню