【问题标题】:Promise factory in AngularAngular 中的 Promise 工厂
【发布时间】:2015-03-19 04:32:38
【问题描述】:

Angular 新手,可能使用错误的承诺。我有一个工厂返回一个承诺:

.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,我不想在我使用数据的每个指令和控制器中写一个新的.then。承诺解决后我不再关心它了,有什么方法可以让myData 在未解决的情况下返回承诺,但在解决完成后只返回结果?

换一种说法,myData 可以简单地成为解决后的.then result,还是我每次都必须写一个新的.then

【问题讨论】:

  • 您是否有可以返回的默认值,而不是已解决的承诺的值?
  • @SteveMitcham 当然,在这种情况下,一个空对象就可以了。

标签: javascript angularjs promise angular-promise


【解决方案1】:

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

【讨论】:

  • 有点。我如何只引用承诺的价值而不是承诺本身?
【解决方案2】:

关于使用承诺

首先,您的myData 服务可以直接返回调用:

.factory('myData', ['$http', function($http) {
    return $http.get('/path/to/endpoint').then(function(req){
       return req.data;
    });
}]);

展开值

所以你知道如何在 Angular 中使用 Promise... 但是,你想要更好的东西,你想要承诺自动解开 Angular 的摘要。这很棘手,但可以做到。请注意,它在代码中可能会造成混淆,我并不真正推荐它,但总体思路如下:

自动展开

.factory('myData', ['$http', function($http) {
    var result = []; // initial result to return
    var p = $http.get('/path/to/endpoint').then(function(res){
       result.push.apply(result, res.data); // add all the items
    });
    result.then = p.then; // allow hooking on it
    return result; // return the array, initially empty
}]);

这会让你做类似的事情:

.controller('myController', ['$scope', 'myData', function($scope, myData) {
    $scope.data = myData;
}]);

这将在那里放置一个空数组并在真实数据到达时替换它(也导致摘要),您仍然可以执行myData.then 以检查它是否已完成自己加载,以便您可以使用旧语法如果你需要确定。

这是个好主意吗?

请注意,Angular 曾经这样做,直到版本 1.2(在 1.3 中完全删除),但由于自动展开被认为太神奇而停止这样做。您可以制定自己的决定,但请注意 Angular 核心团队认为这不是一个好主意。请注意,像 ngResource 这样的东西仍然会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多