我明白什么是The deferred antipattern,也被提及为"被遗忘的承诺" HERE
我还读到:what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it。
无论如何我应该试着摆脱使用$q.defer()
。
但我不明白如何处理我得到回复的案例,我需要拒绝它,因为它没有正确的密钥。
这是我在Service中的方法,它向控制器返回promise。
self.findTime = function(data){
var deferred = $q.defer();
apiClient.findTime(data)
.then(function (response) {
if (response.result !== "success") {
deferred.reject(response);
}
deferred.resolve(response);
}
, function (error) {
deferred.reject(error);
console.error(error);
});
return deferred.promise;
};
因此我尝试将其更改为:
self.findTime = function(data){
return apiClient.findTime(data)
.then(function (response) {
if (response.result !== "success") {
// return WHAT ??? <-------------
}
return response;
}
, function (error) {
// return WHAT ??? <-------------
console.error(error);
});
};
如何处理reject
?
在控制器中,拒绝时我会显示一些早晨消息。
Service.findTime(data).then(function (response) {
// do something
}, function (error) {
// show warn dialog
});
答案 0 :(得分:1)
您有两种选择。
您可以在决心内退回拒绝承诺:
return apiClient.findTime(data)
.then(function (response) {
if (response.result !== "success") {
return $q.reject('reason'); // Convert to rejection
}
return response;
}, function (error) {
console.error(error);
return $q.reject('reason'); // Chain rejection
});
或者您可以抛出异常:
return apiClient.findTime(data)
.then(function (response) {
if (response.result !== "success") {
throw new Error('reason');
}
return response;
}, function (error) {
console.error(error);
throw new Error(error);
});