即使我能够将允诺作为参数传递给错误函数,但它不会触发调用方的& 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);
}
}
发布于 2015-08-26 18:07:38
您的问题是,您要将允诺作为options对象的.deferred
属性传递。您无法解析/拒绝承诺,它们没有.reject
方法(您的代码在尝试调用它时应该抛出)。相反,您需要传递您所持有的deferred
对象。
不过,无论如何,这都是个坏主意。由于jQuery.ajax
已经返回了一个承诺,所以您应该简单地使用$q.when
同化它。
function (palletID, serialNumber) {
return $q.when($.ajax({
…
}));
}
(您将能够省略所有success
和errror
处理程序,角承诺确实会处理它们;如果您想要添加转换或日志记录,请执行承诺中的转换或日志记录)。
然而,这仍然不是最优的,事实上,几乎没有理由使用jQuery.ajax
。只需使用角的 service,它也会立即返回一个角承诺。
https://stackoverflow.com/questions/32232782
复制相似问题