编程语言
首页 > 编程语言> > javascript – Angular的承诺工厂

javascript – Angular的承诺工厂

作者:互联网

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结果,还是每次都要写一个新的.then?

解决方法:

与承诺一起工作

首先,您的myData服务可以返回呼叫:

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

展开值

所以你知道如何在Angular中使用promises …
但是,你想要更好的东西,你希望承诺自动解开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这样的东西仍然这样做.

标签:javascript,angularjs,promise,angular-promise
来源: https://codeday.me/bug/20190609/1206165.html