http - 在 Angular 中一起使用 Promise 和 service

标签 http angularjs

我的问题是基于 this topic在 Angular Google 群组中。
我想提供一个服务来存储一些通过 $http 从后端检索到的基本数据,然后我只需要获取这些数据一次。喜欢,

var load = function() {
   return $http.get(...).then(function(data) {
       return data.user; 
   });
};

module.factory("userProvider", function() {
    var user;
    var getUser = function() {
        if(!user) {
            load().then(function(data) {
               user = data;
           });
        }
        return user;
    };
    return {
        getUser : getUser
    }
});

module.controller("UserController", ["userProvider", function UserController("userProvider") {
    var user = userProvider.getUser();
    // do something with user
}]);

问题是 promise 链在 userProvider 中结束,而不是在 Controller 中结束,所以用户在我第一次使用这个 Controller 时是未定义的,因为数据还没有返回。

如何使用这样的存储服务并正确返回数据?谢谢!

最佳答案

您可以创建自己的 promise 。这是修改后的代码:

module.factory( "userProvider", function( $q ) {
  // A place to hold the user so we only need fetch it once.
  var user;

  function getUser() {
    // If we've already cached it, return that one.
    // But return a promise version so it's consistent across invocations
    if ( angular.isDefined( user ) ) return $q.when( user );

    // Otherwise, let's get it the first time and save it for later.
    return whateverFunctionGetsTheUserTheFirstTime()
    .then( function( data ) {
      user = data;
      return user;
    });
  };

  // The public API
  return {
    getUser: getUser()
  };
});

更新:@yohairosen 提出的以下解决方案适用于许多情况,但并非适用于所有情况。在某些情况下,我们只想缓存成功 结果,就像我在这里所做的那样。例如,如果此请求的失败表明用户需要先登录,我们不希望下一次调用(大概是在登录之后)传递缓存的失败。如果方法不一定在所有情况下都与调用一致,则此方法更好;在所有其他情况下,@yohairosen 的解决方案更简单,值得推荐。

关于http - 在 Angular 中一起使用 Promise 和 service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14332943/

相关文章:

c# HTTP POST——需要跟踪发布/上传进度

ios - 使用 Alamofire 在主体中使用简单字符串的 POST 请求

javascript - 如何在使用编译而不是链接的指令中使用 Angular 中的矩库

javascript - Angular 路由解析 - deferred.reject 不起作用 - Angular 1 + TypeScript

javascript - AngularJS 中未知的 ENV 提供者

javascript - 使用 AJAX 和跨站点脚本读取 header

android - 在我的手机上运行的网络安全策略不允许 CLEARTEXT 通信

php - 没有缓存头的 Laravel 重定向

c# - iis 仅返回 Entity Framework 响应中的第一个对象

javascript - 单击表格行时,它会启用整个表格而不是一行,并且在选择获取值后取消定义