javascript - 在 AngularJS 服务中缓存一个 promise 对象

标签 javascript angularjs promise angular-promise

我想使用 Promises 在 AngularJS 中实现静态资源的动态加载。问题:我在页面上有几个组件可能(或不取决于显示的是动态的)需要从服务器获取静态资源。一旦加载,它可以在整个应用程序生命周期内被缓存。

我已经实现了这个机制,但我是 Angular 和 Promises 的新手,我想确定这是否是一个正确的解决方案\方法。

var data = null;
var deferredLoadData = null;

function loadDataPromise() {
  if (deferredLoadData !== null)
    return deferredLoadData.promise;

  deferredLoadData = $q.defer();

  $http.get("data.json").then(function (res) {
    data = res.data;
    return deferredLoadData.resolve();
  }, function (res) {
    return deferredLoadData.reject();
  });

  return deferredLoadData.promise;
}

因此,只发出一个请求,接下来所有对 loadDataPromise() 的调用都会取回第一个做出的 promise 。它似乎适用于正在进行的请求或一段时间前已经完成的请求。

但是缓存 Promises 是不是一个好的解决方案?

最佳答案

Is this the right approach?

是的。 memoisation的使用在返回 promise 的函数上使用一种通用技术来避免重复执行异步(通常是昂贵的)任务。 promise 使缓存变得容易,因为不需要区分正在进行的操作和已完成的操作,它们都表示为结果值的(相同)promise。

Is this the right solution?

没有。全局 data 变量和 undefined 的解析并不是 promise 的预期工作方式。相反,用结果 data 来履行 promise !它还使编码更容易:

var dataPromise = null;

function getData() {
    if (dataPromise == null)
        dataPromise = $http.get("data.json").then(function (res) {
           return res.data;
        });
    return dataPromise;
}

然后,不是 loadDataPromise().then(function() {/* 使用全局 */数据 }) 它只是 getData().then(function(data) { ... })

为了进一步改进模式,您可能希望将 dataPromise 隐藏在闭包范围内,并注意当 getData 接受参数时您需要查找不同的 promise (如网址)。

关于javascript - 在 AngularJS 服务中缓存一个 promise 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744830/

相关文章:

javascript - 将模拟服务注入(inject) Angular Testing 的未知问题

javascript - Uncaught (in promise) undefined - Vue-router

javascript - 如何在 vue.js 中对计算属性进行排序

javascript - Grunt——在同一端口上运行 Connect 和 Express 服务器

javascript - 我怎样才能让这个 plunker 可以运行?

javascript - JavaScript 中的可观察对象和 promise 之间有什么区别?

javascript - 获取数据 promise angularJS

javascript - 如何在javascript函数中使用php中mysql数据库的值

javascript - 使用 jQuery 淡出文本字段内的文本值

javascript - 创建 UL 列以列出所选文件和上传文件中的文件