Javascript 美国的承诺工厂

Javascript 美国的承诺工厂,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,刚接触棱角的人,可能使用的承诺是错误的。我有一家工厂承诺: .factory('myData', ['$http', '$q', function($http, $q) { var deferred = $q.defer(); $http.get('/path/to/endpoint') .success(function(data) { deferred.resolve(data); }) .error(

刚接触棱角的人,可能使用的承诺是错误的。我有一家工厂承诺:

.factory('myData', ['$http', '$q', function($http, $q) {
    var deferred = $q.defer();

    $http.get('/path/to/endpoint')
        .success(function(data) {
            deferred.resolve(data);
        })
        .error(function(err) {
            deferred.reject(err.what())
        });

    return deferred.promise;
}])
现在,如果我将工厂注入某个地方,我可以使用承诺:

.controller('myController', ['$scope', 'myData', function($scope, myData) {
    myData.then(function(result) {
        $scope.data = result;
    });
}]);
这很好,但是我开始在几个地方使用
myData
,我不想写一个新的
。然后在每个指令和控制器中使用数据。在承诺得到解决后,我不再关心它了,有没有办法让
myData
返回一个承诺,如果它没有得到解决,但只在解决完成后返回结果


换言之,
myData
是否可以简单地成为
。然后
解析后的结果
,还是我必须每次都写一个新的
。然后

是,在服务/工厂中解析承诺,并在控制器中引用解析的承诺值,而不是在控制器中引用和处理承诺。希望这是有意义的。

关于承诺的工作 首先,您的
myData
服务只需返回呼叫即可:

.factory('myData', ['$http', function($http) {
    return $http.get('/path/to/endpoint').then(function(req){
       return req.data;
    });
}]);
展开值 所以你知道如何用承诺来工作。。。 但是,你想要更好的东西,你想要用Angular的消化液自动打开的承诺。这很棘手,但可以做到。请注意,它可能会在代码中造成混乱,我并不推荐使用它,但这里有一个总体思路:

自动展开 这将允许您执行以下操作:

.controller('myController', ['$scope', 'myData', function($scope, myData) {
    $scope.data = myData;
}]);
这将在那里放置一个空数组,并在实际数据到达时替换它(也会导致摘要),您仍然可以执行
myData。然后
检查自己是否加载完毕,以便在需要确定的情况下使用旧语法

这是个好主意吗?
请注意,Angular在1.2版(在1.3版中完全删除)之前一直用于执行此操作,但由于自动展开被认为太神奇,因此停止执行此操作。您可以制定自己的决策,但请注意,Angular core团队认为这不是一个好主意。请注意,ngResource之类的东西仍然可以这样做。

您是否有可以返回的默认值,而不是已解析承诺的值?@SteveMitcham当然,在这种情况下,空对象也可以。有点像。我如何只提及承诺的价值而不是承诺本身?
.controller('myController', ['$scope', 'myData', function($scope, myData) {
    $scope.data = myData;
}]);