【问题标题】:Angularjs caching vs fetching live dataAngularjs缓存与获取实时数据
【发布时间】:2015-12-22 23:55:21
【问题描述】:

我正在使用一项服务来获取应用程序的数据。

由于服务是单例,我想在服务中缓存一些参考数据,但我不确定如何实现。

我正在使用 Strongloop,现在在服务中有这样的功能:

function fetchReferenceData() {
    return refInfo.find().$promise;
}

我想要一个存储参考数据的属性。 我可以在代码中添加一个属性,比如 var myRefData;

然后我可以编辑 fetchReferenceData() 来检查该属性,但由于客户端期望得到回复,这将不起作用:

function fetchReferenceData() {
    if (myRefData) { return myRefData; }
    else { return refInfo.find().$promise;}
}

有什么好的编程模式可以处理这种事情? 我是否传入一个函数来调用 .then() 来设置客户端中的数据?

【问题讨论】:

标签: angularjs promise strongloop


【解决方案1】:

如果客户期待一个承诺,您可以使用$q 服务从您的缓存值创建一个承诺。

function fetchReferenceData() {
    if (myRefData) { return $q.when(myRefData); }
    else { return refInfo.find().$promise;}
}

客户端可以使用标准的.then方法访问它。

fetchReferenceData().then (function (myRefData) {
    //use myRefData
});

最佳做法

  • 您需要一种方法来销毁缓存中的信息。

  • 如果查询已在进行中,您需要避免再次调用refInfo.find()

ngResource 对象的更新

来自Angular $resource services 的方法返回对空对象的引用。

来自文档:

重要的是要意识到调用 $resource 对象方法会立即返回一个空引用(对象或数组取决于isArray)。从服务器返回数据后,现有参考将填充实际数据。这是一个有用的技巧,因为通常将资源分配给模型,然后由视图呈现。拥有一个空对象不会导致渲染,一旦数据从服务器到达,那么该对象就会被数据填充,并且视图会自动重新渲染自身以显示新数据。这意味着在大多数情况下,我们不必为操作方法编写回调函数。

因此您可以缓存查询引用,但您需要注意其上的数据将在一段时间内未定义。

$resource 服务还添加了一个 $promise 属性,可供接受承诺的客户端使用。

function fetchReferenceData() {
   var cache;
   return cache = cache || refInfo.find(); 
}

clientThatNeedsPromise(fetchReferenceData().$promise);

【讨论】:

  • 应用回收时缓存中的信息不会消失吗?
  • 我想在这个函数中加入存储参考数据。有没有一种方法可以让我自己处理 $promise,存储数据然后将其返回给客户端?
  • refInfo.find() 是否使用$resource 服务?
  • Georgeawg:确实如此,通过 StrongLoop
猜你喜欢
  • 2012-02-21
  • 2018-04-03
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多