0

我有一个工厂对象,其中包含专用对象,它用于缓存使用工厂可用函数从API检索结果。角厂存储承诺结果

global.mainApp.factory('SessionFactory', function (UserEndpointsResource, SiteEndpointsResource) { 
    var data = { 
     /** 
     * @type {boolean|null} 
     */ 
     isLoggedIn: null 
    }; 
    return { 
     isUserLoggedIn: function (callback) { 
      if (data.isLoggedIn != null) { 
       callback(data.isLoggedIn); 
      } 
      else { 
       UserEndpointsResource.isLoggedIn().$promise.then(function (res) { 
        var isUserLoggedIn = res.status == 1; 
        // Trying to set the result to the outer scope data variable 
        data.isLoggedIn = isUserLoggedIn; 
        callback(isUserLoggedIn); 
       }, function (failureData) { 
        data.isLoggedIn = false; 
        callback(false); 
       }); 
      } 
     }, 
     ... 
    }; 
}); 

问题是,每次我调用isUserLoggedIn函数时,data.isLoggedIn始终为空。

如何更改promise函数内的工厂数据对象?

谢谢。

+0

有没有机会实例化多个'SessionFactory's? – Bergi

+1

Protip:[不存储承诺结果,存储承诺本身](http://stackoverflow.com/q/18744830/1048572) – Bergi

+0

你是否检查过你的代码是否正在进入'data.isLoggedIn = isUserLoggedIn;'? –

回答

0

使用评论中提供的建议,又名do not store promise results, store promises themselves,这是修改的工作代码!

global.mainApp.factory('SessionFactory', function (UserEndpointsResource, SiteEndpointsResource) { 
    var data = { 
     /** 
     * @type {boolean|null} 
     */ 
     isLoggedIn: null 
    }; 
    return { 
     isUserLoggedIn: function (callback) { 
      if (data.isLoggedIn != null) { 
       data.isLoggedIn.then(function (isLoggedIn) { 
        callback(isLoggedIn.status == 1); 
       }); 
      } 
      else { 
       data.isLoggedIn = UserEndpointsResource.isLoggedIn().$promise.then(function (res) { 
        var isUserLoggedIn = res.status == 1; 
        callback(isUserLoggedIn); 
        return isUserLoggedIn; 
       }, function (failureData) { 
        data.isLoggedIn = false; 
        callback(false); 
        return null; 
       }); 
      } 
     } 
    }; 
});