UI-Router Resolve 中的 $q Promise?

$q Promise in UI-Router Resolve?

其实这道题可以简化为"Return an $http or Restangular call result in a promise"。我的目标是拥有一个在 $http 调用完成后解析的 promise 对象:

var deferredCall= $q.defer();

然后调用解决:

$http.get (url)
   .then(function(result){ deferredCall.resolve('Success' + result);},
    function(){ deferredCall.resolve('Failure' + error););

然后我有一个 promise 对象,当调用完成时(成功或失败),这就是我想要的:

deferredCall.promise.then(function (value) {
    return //something to pass to controller;
});

目标是无论解析成功与否,控制器都会被实例化。我的问题? Resolve只能接受一个promise,所以:`deferredCall.promise。我如何使用 Resolve / through a service 通过上面的调用来解决这个承诺?服务方法的结果是承诺吗?

比如我创建一个服务,其方法调用 $http 然后 returns deferredCall?

这是我们在项目中解析数据的方式:

Angular $routeProvider:

$routeProvider
    .when('/something/something', {
        templateUrl: 'somewhere/some-details.html',
        controller : SomeController,
        resolve : {
            someItem : function (SomeService) {
                return SomeService.getSomethingAll();
            }
        }
    })

控制器:

var SomeController = function ($scope, someItem) {};

数据服务:

.service('SomeService', function (SomeUtils, $http) {
    return {
        getSomethingAll : function () {
            return SomeUtils.promiseHttpResult($http.get("api/something/all"));
        }
    }
})

实用程序服务:

.service("SomeUtils", function($q) {
    return {
        promiseHttpResult: function (httpPromise) {
            var deferred = $q.defer();
            httpPromise.success(function (data) {
                deferred.resolve(data);
            }).error(function () {
                deferred.reject(arguments);
            });
            return deferred.promise;
        }
    }
})

漂亮又简单。无需技能:) (DD)