如何在返回承诺的服务中创建 reset() 方法

How to create reset() method in Service that return promise?

本文关键字:reset 创建 方法 服务 返回 承诺      更新时间:2023-09-26

我有一个名为MyArticles的服务。使用 $http GET 收集给定类别的所有文章。MyArticles服务注入ControllerAControllerBControllerC中,在解析MyArticles Promise后应该运行一些命令。

第一次初始化后工作,但如果我需要重置()MyArticles的加载数据,我不知道该怎么办,因为ControllerA, ControllerB, ControllerC中的命令仅在第一次运行,在承诺解决后。例如,如果我想从其他类别获取文章怎么办?

正在尝试为此找到一种模式,我写了以下内容,我想这有助于理解我想要实现的目标:

var MyApp = angular.module('MyApp', []);
MyApp.config(function($locationProvider){
  $locationProvider.hashPrefix('!');
});
MyApp.factory('MyService', function($q,$timeout){
    var deferred;
    var loadData = function(){
        deferred = $q.defer();
        $timeout(function(){
            deferred.resolve({ 
                myData: "test"
            });
        }, 250);
    };
    return {
        reset: function(){
            loadData();
        },
        getPromise: function(){
            return deferred.promise;
        }
    };
});
MyApp.controller('MyCtrl', function($scope,MyService){
  $scope.foo = "Service share data";
  MyService.reset();
  MyService.getPromise().then(function(data){
        console.log(data);
  });
});

*该示例也可在以下网址获得: http://jsbin.com/OCaNehe/2/

想知道我能做什么,如果我需要一个服务 - 使用承诺 - 应该能够刷新数据并且服务正在注入不同的控制器等?

感谢您的观看!

另一种选择是使用手表。请参阅:http://plnkr.co/edit/auovRxGPViyflUVPvG1A?p=preview。与以后的 $emit/$broadcasts 相比,它可能更容易维护,特别是如果您最终拥有大量服务以及使用它们的指令和控制器。

此外,您可能要考虑使用自然范围继承角度,但这取决于您的应用程序。