当前位置: 首页 > 面试题库 >

在AngularJS服务中缓存一个Promise对象

柯英奕
2023-03-14
问题内容

我想使用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()的下一次调用都返回第一个作出的承诺。似乎正在请求进度,或者已经完成了一段时间。

但这是缓存Promises的好解决方案吗?


问题答案:

这是正确的方法吗?

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

这是正确的解决方案吗?

否。全局data变量及其解决方案undefined并不是promise的工作原理。相反,用结果实现承诺data!这也使编码容易得多:

var dataPromise = null;

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

然后,代替loadDataPromise().then(function() { /* use global */ data })它只是getData().then(function(data) { … })

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



 类似资料:
  • 我希望能够创建一个自定义的AngularJS服务,当其数据对象为空时发出HTTP“GET”请求,并在成功时填充数据对象。 下一次调用此服务时,我希望绕过再次发出HTTP请求的开销,而是返回缓存的数据对象。 这可能吗?

  • 问题内容: 我希望能够创建一个自定义AngularJS服务,该服务在其数据对象为空时发出HTTP“获取”请求,并在成功时填充该数据对象。 下次调用此服务时,我想绕过再次发出HTTP请求的开销,而是返回缓存的数据对象。 这可能吗? 问题答案: Angular的$ http 内置了一个缓存。根据文档: cache – {boolean | Object} – 用$ cacheFactory创建的布尔值

  • 本文向大家介绍AngularJS 中的Promise --- $q服务详解,包括了AngularJS 中的Promise --- $q服务详解的使用技巧和注意事项,需要的朋友参考一下 先说说什么是Promise,什么是$q吧。Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered。 什么是Promise 以前了解过Ajax的都能体

  • 本文向大家介绍如何在 Java 中实现一个 redis 缓存服务,包括了如何在 Java 中实现一个 redis 缓存服务的使用技巧和注意事项,需要的朋友参考一下 缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度。将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度。一个 web 应用的简单结构如下图。 web 应用典型架构 在这个结构中,用户的请求通过用户

  • 从我的Service Worker中,我在浏览器缓存中保存了一些资产,以及Service Worker脚本本身,它工作正常,这样我就可以在我的devols缓存选项卡中看到Service Worker url和所有其他资产。 现在,当我脱机时,我的服务人员将侦听事件并从缓存中获取所有资产。 但是,当页面尝试注册工作程序本身时,似乎没有获取事件,因此我在控制台中遇到以下错误: 控制台错误 控制台ero

  • 问题内容: 是否可以在angularJS中将一个服务注入到另一个服务中? 问题答案: 是。遵循angularjs中的常规注入规则。 感谢@simon。最好使用数组注入以避免最小化问题。