延迟反模式,如何处理拒绝?
The deferred antipattern, how to handle rejects?
我明白什么是The deferred antipattern, also mentioned as "The Forgotten Promise" HERE。
我还看了:what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it。
无论如何我应该尝试摆脱使用 $q.defer()
。
但我不明白如何处理我得到响应的情况,我需要拒绝它,因为它没有正确的密钥。
这是我在服务中returns向控制器承诺的方法。
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
});
你有两个选择。
您可以 return 发自内心的拒绝承诺:
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);
});
我明白什么是The deferred antipattern, also mentioned as "The Forgotten Promise" HERE。
我还看了:what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it。
无论如何我应该尝试摆脱使用 $q.defer()
。
但我不明白如何处理我得到响应的情况,我需要拒绝它,因为它没有正确的密钥。
这是我在服务中returns向控制器承诺的方法。
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
});
你有两个选择。
您可以 return 发自内心的拒绝承诺:
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);
});