Javascript Ajax Post包装器

时间:2015-10-05 13:02:22

标签: javascript angularjs

我有一个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&#39;。这不是我所期望的,undefined&#39; 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;我该如何解决这个问题?

2 个答案:

答案 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/