我有一个angularjs项目,我在其中构建了ajaxService
,它基本上包裹着$http.post()
。我想要实现的是一个简单的服务,可以在出现错误时创建警报,但是覆盖.error()
函数不应该删除此警报(我希望无论如何都要调用它)。起初我刚刚返回了$http.post()
的承诺,但在.error()
被覆盖时删除了.error()
服务的实现。
首先,我有这个实现:
this.Post = function (url, data) {
return $http.post(
'Server/Server.php',
{ 'url': url, 'data': data }
)
.error(function (response) {
alertsService.RenderErrorMessage(response);
});
}
但如果您随后实施以下内容,则不会调用RenderErrorMessage()
(它已被覆盖):
ajaxService.Post(ajaxUrlService.GetUserGroupsByUser(), { 'userId': userService.id })
.error(function (response) {
userService.groups = response;
});
为了解决这个问题,我尝试了以下方法:
this.Post = function (url, data) {
var obj = new Object();
obj.success = function (response) {};
obj.error = function (response) {};
$http.post(
'Server/Server.php',
{ 'url': url, 'data': data }
)
.success(function (response) {
if (typeof response == "String" && response.indexOf('xdebug-error') > 0) {
alertsService.RenderErrorMessage(response);
obj.error(response);
}
else {
obj.success(response);
}
})
.error(function (response) {
alertsService.RenderErrorMessage(response);
obj.error(response);
});
return obj;
}
.Post()
没有返回obj
,它会返回undefined
'。这不是我所期望的,undefined
' void SipCall::onCallMediaState(pj::OnCallMediaStateParam& /*prm*/)
{
pj::CallInfo call_info = getInfo();
pj::AudioMedia* audio_media = 0;
for (unsigned int i = 0; i < call_info.media.size(); ++i) {
if (call_info.media[i].type == PJMEDIA_TYPE_AUDIO) {
audio_media = static_cast<pj::AudioMedia*>(getMedia(i));
break;
}
}
if (audio_media != 0) {
try {
pj::AudioMediaRecorder recorder;
recorder.createRecorder("file.wav");
audio_media->startTransmit(recorder);
pj_thread_sleep(5000);
audio_media->stopTransmit(recorder);
}
catch (pj::Error& err) {
qWarning("[SipAccount::onIncomingCall] : Failed to record call to %s. Error = %s", "file.wav", err.info().data());
}
}
}
&#39;我该如何解决这个问题?
答案 0 :(得分:1)
如果我理解正确,您希望对服务内部的错误执行一些特殊处理,但也允许在服务之外处理错误。
https://jsbin.com/bepozi/edit?html,js,console,output
示例用另一个承诺“包装”$http
承诺。 “内部承诺”执行一些特殊处理(写入控制台)。然后,AppController
也可以通过将错误写入模型来执行自己的错误处理。
但是,对于http请求中的一般错误处理,我个人会使用http interceptor。
答案 1 :(得分:1)
考虑使用$ http拦截器,这种机制允许您通过注册自己的处理程序来处理$ http服务执行的请求和响应。
声明一个拦截器:
module.factory('myInterceptor', ['$log', function($log) {
$log.debug('$log is here to show you that this is a regular factory with injection');
var myInterceptor = {
....
....
....
};
return myInterceptor;
}]);
注册:
module.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('myInterceptor');
}]);
在此处阅读更多内容:http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/