Angularjs 解析方法的问题

Angularjs 解析方法的问题,angularjs,angular-ui-router,promise,angular-ui,angular-promise,Angularjs,Angular Ui Router,Promise,Angular Ui,Angular Promise,嗨,我有一个$stateProvider,如下所示 $stateProvider .state('team.details', { url: '/:teamId', views: { '@': { controller: 'teamDetailsCtrl', templateUrl: 'src/modules/team/details/teamDetails.html', resolve: { user: function ($

嗨,我有一个$stateProvider,如下所示

$stateProvider .state('team.details', {
  url: '/:teamId',
  views: {
    '@': {
      controller: 'teamDetailsCtrl',
      templateUrl: 'src/modules/team/details/teamDetails.html',
      resolve: {
        user: function ($stateParams, TeamResource) {
          return TeamResource.get({ teamid: $stateParams.teamId }).$promise;
        }

TeamResource.get正在调用rest api,如果数据是从rest api发送的(teamid存在于数据库中),那么一切都正常工作。但是如果数据不存在,那么我必须将其路由到“家”。我如何才能完成它?

您的API返回什么样的响应?我的建议是为你的应用程序设置一个全局http拦截器,它可以监听404响应。在这种情况下,将用户重定向到您所在的州

通过将逻辑放在拦截器中而不是解析中,如果您有多个状态可以从这种检查中受益,则可以避免冗余代码

这是一个示例拦截器,取自SO post

请注意,这可能仅适用于特定端点(例如团队)。您可以通过访问response的url属性来检查调用了哪个url。像这样:
response.url

var interceptor = ['$q', '$state', function ($q, $state) {

    function success(response) {
        return response;
    }

    function error(response) {
        var status = response.status;
        var url = response.url;

        if (status == 404) {
            $state.go('home')
            return;
        }

        // otherwise
        return $q.reject(response);
    }

    return function (promise) {
        return promise.then(success, error);
    }

}];

$httpProvider.responseInterceptors.push(interceptor);

您可以处理这个问题,如果有数据,那么使用chain promise返回该数据,或者将数据重定向到不同的状态

代码

resolve: {
  user: function($stateParams, TeamResource, $state) {
    return TeamResource.get({
      teamid: $stateParams.teamId
    }).$promise.then(function(data) {
      if (!data.length > 0) { //here might be you need to use something else instead of data
        $state.go('home')
        return
      } else {
        return data;
      }
    });
  }
Angular
$http.get()
本身返回一个承诺。如果出现任何错误,您只需使用
$q
服务拒绝相同的错误

决心:

resolve : {
    user : function ($stateParams, TeamResource) {
        return TeamResource.get({
            teamid : $stateParams.teamId
        });
    }
}
团队资源下。获取

return {
    get : function (teamObj) {
        $http.get("/url", teamObj).then(function (resp) {
            if (resp.length) {
                return resp;
            } else {
                return $q.reject(resp);
            }
        }, function (err) {
            return $q.reject(resp);
        });
    }
}
如果在
promise()
中使用
$q.reject()
返回,则promise链将其发送到下一个链的错误回调,如果您仅返回某个内容,它将其发送到下一个promise链中的成功函数


@罗宾很高兴帮助你谢谢