javascript - Angular 中的 promise 工厂

标签 javascript angularjs promise angular-promise

Angular 的新手,可能会错误地使用 promises。我有一个返回 promise 的工厂:

.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;
}])

现在,如果我将我的工厂注入(inject)某个地方,我就可以使用 promise :

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

这很好,但我开始在几个地方使用 myData,我不想在每个指令和 Controller 中编写新的 .then我使用数据。 promise 解决后我不再关心它了,有没有办法让 myData 在未解决时返回一个 promise ,但在完成解决后只返回结果?

换句话说,myData 可以简单地是 .then result 解析后,还是我必须写一个新的 .then 每一次?

最佳答案

关于使用 promise

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

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

展开值

所以你知道如何在 Angular 中使用 promise ...... 但是,你想要更好的东西,你想要使用 Angular 的摘要自动解包的 promise 。这很棘手,但可以做到。请注意,它可能会使代码困惑,我并不真正推荐它,但这是一般的想法:

自动展开

.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 - Angular 中的 promise 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053951/

相关文章:

javascript - 传单:连接线内可拖动标记的架构

javascript - 如何更改react-big-calendar中特定日期的背景颜色

AngularJs 内存泄漏 : scope $$watchers increase even if the watched elements are removed

angularjs - 使用 angularjs 进行 json 输入验证

javascript - 与 `forEach` 使用相关的异步/等待竞争条件?

javascript - 使用深层嵌套的异步函数进行错误处理

javascript - 如果 div 边距设置为自动,如何获得以像素为单位的 div 左右边距?

javascript - Jasmine .js : Race Conditions when using "runs"

javascript - 查找数组中的属性并获取索引

javascript - Promise.所有 Promise 参数