首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从firebase promise调度操作后,ngrx存储不更新UI

的问题可能是由于异步操作导致的。在Angular应用中,ngrx是一个用于状态管理的库,它基于Redux模式,通过存储和管理应用的状态来实现数据的一致性和可预测性。

当使用firebase进行异步操作时,例如从数据库获取数据或执行其他操作,可能会导致ngrx存储不及时更新UI的问题。这是因为异步操作的结果需要一定的时间才能返回,并且在返回之前,ngrx可能已经完成了状态的更新。因此,需要采取一些措施来确保ngrx存储及时更新UI。

解决这个问题的一种方法是使用rxjs的Observable来处理异步操作。在Angular中,可以使用rxjs的from函数将firebase promise转换为Observable,并使用ngrx的Effect来处理这个Observable。Effect是ngrx提供的一个中间件,用于处理副作用,例如异步操作。

首先,需要在ngrx的store中定义一个action,用于触发异步操作。例如:

代码语言:txt
复制
import { createAction, props } from '@ngrx/store';

export const loadFirebaseData = createAction('[Data] Load Firebase Data');
export const loadFirebaseDataSuccess = createAction('[Data] Load Firebase Data Success', props<{ data: any }>());
export const loadFirebaseDataFailure = createAction('[Data] Load Firebase Data Failure', props<{ error: any }>());

然后,在ngrx的effect中处理这个action,并将firebase promise转换为Observable。例如:

代码语言:txt
复制
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { of } from 'rxjs';
import { catchError, map, mergeMap } from 'rxjs/operators';
import { DataService } from 'path-to-data-service';

@Injectable()
export class DataEffects {
  loadFirebaseData$ = createEffect(() =>
    this.actions$.pipe(
      ofType('[Data] Load Firebase Data'),
      mergeMap(() =>
        this.dataService.getData().pipe(
          map((data) => ({ type: '[Data] Load Firebase Data Success', data })),
          catchError((error) => of({ type: '[Data] Load Firebase Data Failure', error }))
        )
      )
    )
  );

  constructor(private actions$: Actions, private dataService: DataService) {}
}

在上面的代码中,loadFirebaseData$是一个Effect,它监听[Data] Load Firebase Data这个action,并在触发时调用dataService.getData()方法获取数据。然后,使用map操作符将数据转换为[Data] Load Firebase Data Success这个action,并使用catchError操作符处理错误情况。

最后,在组件中触发[Data] Load Firebase Data这个action,并订阅ngrx存储中的数据。例如:

代码语言:txt
复制
import { Component, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';
import { loadFirebaseData } from 'path-to-actions';
import { selectData } from 'path-to-selectors';

@Component({
  selector: 'app-my-component',
  template: `
    <div>{{ data | json }}</div>
  `,
})
export class MyComponent implements OnInit {
  data$ = this.store.select(selectData);

  constructor(private store: Store) {}

  ngOnInit() {
    this.store.dispatch(loadFirebaseData());
  }
}

在上面的代码中,data$是一个Observable,它订阅ngrx存储中的数据。在组件初始化时,触发[Data] Load Firebase Data这个action,从而开始异步操作。当数据更新时,data$会自动更新,并更新UI。

需要注意的是,以上代码只是一个示例,实际情况可能会有所不同。具体的实现方式取决于应用的架构和需求。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云数据库 TencentDB:https://cloud.tencent.com/product/cdb
  • 云服务器 CVM:https://cloud.tencent.com/product/cvm
  • 云原生应用引擎 TKE:https://cloud.tencent.com/product/tke
  • 云存储 COS:https://cloud.tencent.com/product/cos
  • 人工智能平台 AI Lab:https://cloud.tencent.com/product/ailab
  • 物联网平台 IoT Explorer:https://cloud.tencent.com/product/ioe
  • 移动开发平台 MDP:https://cloud.tencent.com/product/mdp
  • 区块链服务 BaaS:https://cloud.tencent.com/product/baas
  • 元宇宙服务 Metaverse:https://cloud.tencent.com/product/metaverse

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序

但是,尽管代替Observable的承诺将只运行一次并在此之后处理,但只要流正在更新并且我们取消订阅,Observable就会持续运行。...对于那些曾经听说过Ruby on Rails中的约定优先配置的用户,稍后会看到一些相似之处),以便我们回答我们的应用程序应该如何决定它需要显示一些界面元素(如可折叠的侧边栏),或者它应该在从服务器接收到它的会话状态存储它的位置...请记住,我们正好将Firebase集成到我们的应用程序中。现在它由于高度可维护的Ngrx商店而丢失了。也就是说,它存储在任何地方。...我们可以使用诸如ngrx-store-localstorage之类的东西来存储我们的数据到浏览器的localStore,但是如何使用API​​呢?...我们的日志中可以看出,我们正在明确调度Action,但没有服务器请求在这里为我们提供。怎么了?我们忘了将我们的效果加载到我们的AppModule中。

42.5K10

Angular v18 现已推出!

UI。... v18 开始,事件调度在使用混合渲染时为事件回放提供支持。大多数开发人员不会直接与事件调度进行交互,因此让我们研究一下为什么事件回放很有用。您可以在下面找到一个简单的电子商务网站的模拟。... v18 开始使用事件调度,Angular 将开始记录用户事件。一旦应用程序被水化,事件调度就会重播它们,我们最终在购物车中有六件商品。... v18 开始,所有组件和基元都完全兼容水合。我们的部分补水计划我们在 ng-conf 和 Google I/O 上宣布了部分水合作用。这是一种技术,允许您在服务器端呈现逐步为应用补水。...在过去的 6 个月中,我们人们那里收集了更多反馈,并完善了更新体验,使每个人都能够迁移到新的构建体验并获得编辑/刷新提升。您可以在我们的更新指南中找到我们开发的工具,以自动执行更新体验。

8110

2019-Web开发技术指南和趋势

不使用任何框架和库区学习原生的JS语法 数据类型, 函数, 条件判断, 循环, 凑总府 DOM操作和事件 JSON Fetch ES6+(箭头函数, Promise, async/await, 解构)...构建静态站点 构建UI布局(拿到设计图能够使用HTML/CSS还原) 添加一些交互功能 部署和维护网站 现在能找到最低水平的Web开发工作, 但是这是远远不够的.... 2....在大公司开发中非常流行 更多的交互 & 有趣的UI组件 组件化 & 模块化前端代码 对团队有利 2.4 状态管理 ?...对于使用框架的大型前端项目, 你也许需要使用状态管理工具去管理你的应用级的状态 Redux(Context API) Apollo(GraphQL Client) Vuex NgRx 2.5 满足一个成熟的前端开发者条件...内容管理系统允许快速开发并为您的客户提供更新内容的能力. 在你需要快速开发网站的时候, 它们是很适合的. 特别是对于自由开发者.

3.3K20

Angular 接入 NGRX 状态管理

NGRX 状态管理生命周期图中包含了以下元素: Store:集中的状态存储; Action:根据用户所触的不同事件执行不同的 Action ; Reducer:根据不同的 Action 对 Store...--standalone=false 安装 NGRX 核心模块: @ngrx/store:状态管理核心模块,包含了状态存储、Actions、Reducers、Selectors; @ngrx/store-devtools...(仅存储一位用户); 创建根据 Action 来更新状态的 Reducer: 选项介绍: 选项 作用 --reducers 执行reducers存放路径,约定路径为上一级的 index.ts,也是 store...UpdateUser: emptyProps(), }, }); 完成副作用编写: 在 UserEffects 中注入 UserService 开始创建副作用,总共 4 步操作: import {...、删除、批量添加、批量更新、批量删除、清空等操作,还可以通过其内置的 Selector 方便的获取 Todos 数据,数据的长度等等信息,可以简化一大部分的开发时间。

17510

2019-Web开发技术指南和趋势

不使用任何框架和库区学习原生的JS语法 数据类型, 函数, 条件判断, 循环, 凑总府 DOM操作和事件 JSON Fetch ES6+(箭头函数, Promise, async/await, 解构)...构建静态站点 构建UI布局(拿到设计图能够使用HTML/CSS还原) 添加一些交互功能 部署和维护网站 现在能找到最低水平的Web开发工作, 但是这是远远不够的.... 2....在大公司开发中非常流行 更多的交互 & 有趣的UI组件 组件化 & 模块化前端代码 对团队有利 2.4 状态管理 ?...对于使用框架的大型前端项目, 你也许需要使用状态管理工具去管理你的应用级的状态 Redux(Context API) Apollo(GraphQL Client) Vuex NgRx 2.5 满足一个成熟的前端开发者条件...内容管理系统允许快速开发并为您的客户提供更新内容的能力. 在你需要快速开发网站的时候, 它们是很适合的. 特别是对于自由开发者.

3.3K20

微信终端自研 C++协程框架的设计与实现

原因: owl 基础库需要支持尽量多的操作系统和架构,操作系统包括:Android、iOS、macOS、Windows、Linux、RTOS;架构包括:x86、x86_64、arm、arm64、loongarch64...使用 RunLoop 作为调度器除了协程不用加锁,还有一些额外的好处: 协程中的代码可以和 RunLoop 中的传统异步代码和谐共处 若使用 UI 框架的 RunLoop 作为调度器,协程中可以直接访问...结构化并发 想象这样一个场景:我们写一个 UI 界面,在这个界面会启动若干协程通过网络去拉取和更新数据,当用户退出 UI 时,为了泄露资源,我们希望协程以及协程发起的异步操作都能取消。...当然,我们可以通过手动保存每一个协程的句柄,在 UI 退出时通知每一个协程退出,并等待所有协程都结束再退出 UI。然而,手动进行上述操作非常繁琐,而且很难保证正确性。...一个对象 一个 UI 页面 如上图所示,代码由上而下执行,在进入外部 scope scope 中启动了两个协程,并进入了内部 scope,当执行流最终外部 scope 出来时,结构化并发机制必须保证这两个协程已经结束

1.5K31

它来了!Flutter3.0发布全解析

Flutter 3完成了我们以移动为中心到多平台框架的路线图,提供了对macOS和Linux桌面应用的支持,以及对Firebase集成的改进,新的生产力和性能特性,并支持Apple Silicon。...对我们的设计师来说,最重要的是,可以轻松地构建新的UI,这意味着我们的团队花在对规格说 " "的时间更少,花在迭代上的时间更多。...我们的目标是让你能够灵活地充分利用底层操作系统,同时尽可能多地分享你选择的用户界面和逻辑。...Firebase and Flutter 当然,建立一个应用程序不仅仅是一个UI框架。应用程序发布者需要一套全面的工具来帮助你构建、发布和运营你的应用程序,包括认证、数据存储、云功能和设备测试等服务。...这包括将Flutter的Firebase插件提高到1.0,增加更好的文档和工具,以及像FlutterFire UI这样的新部件,为开发者提供可重用的auth和profile界面的UI

8K20

微信终端自研C++协程框架的设计与实现

原因: owl 基础库需要支持尽量多的操作系统和架构,操作系统包括:Android、iOS、macOS、Windows、Linux、RTOS;架构包括:x86、x86_64、arm、arm64、loongarch64...使用 RunLoop 作为调度器除了协程不用加锁,还有一些额外的好处: 协程中的代码可以和 RunLoop 中的传统异步代码和谐共处 若使用 UI 框架的 RunLoop 作为调度器,协程中可以直接访问...结构化并发 想象这样一个场景:我们写一个 UI 界面,在这个界面会启动若干协程通过网络去拉取和更新数据,当用户退出 UI 时,为了泄露资源,我们希望协程以及协程发起的异步操作都能取消。...当然,我们可以通过手动保存每一个协程的句柄,在 UI 退出时通知每一个协程退出,并等待所有协程都结束再退出 UI。然而,手动进行上述操作非常繁琐,而且很难保证正确性。...一个对象 一个 UI 页面 如上图所示,代码由上而下执行,在进入外部 scope scope 中启动了两个协程,并进入了内部 scope,当执行流最终外部 scope 出来时,结构化并发机制必须保证这两个协程已经结束

2.1K31

Flutter 3.7 新特性:介绍后台isolate通道

或者某个应用可能正在进行大量计算,而开发人员希望这些计算影响 UI。 在我帮助谷歌其他团队使用 Flutter 的过程中,随着产品的演进,最终会不可避免地遇到 root isolate 瓶颈。...用户之前创作都被存储Firebase Cloud 中,需求是用户可以用手机随时分享创作。...该 Flutter 应用启动时会开启一个后台 isolate Firebase Cloud Store 下载 8K 文本提示相关图片,将图像压缩至指定规格大小导出,保存到相册,最后导出完成并发送通知...在此示例中,后台 isolate 至少使用了 3 个插件,一个用于 Firebase Cloud Storage 中请求数据;接着保存到手机相册,保存完毕发送本地通知告诉用户。...为了保证后台 isolate 正常运行,发送消息的 isolate 应该被持有,以便引擎可以在该 isolate 的事件循环上调度结果,这是通过Dart’s ports来实现的,Dart ports 存储并持有

4.1K40

满足 Google Play 目标 API 等级 (targetSdkLevel) 的要求

2018 年 8 月起,所有向 Google Play 提交的新应用都必须针对 Android 8.0 (API 等级 26) 开发。...若消息接收需要必要后台工作,如后台数据同步,您的应用须要通过 Firebase Job Dispatcher 或者 JobIntentService 调度任务。...请将您的 app Google Cloud Messaging (GCM) 迁移至 Firebase Cloud Messaging 最新版本; 使用高级窗口管理: - Declare Restricted...查看更多指导文档链接 测试您的应用 在更新完应用的 API 等级和功能,您须要测试一些核心用例。下文列举的几条建议并没有涵盖所有情况,但希望能给您提供指导作用。...我们建议进行以下几个方面的测试: 测试应用兼容 API 26, 产生错误和警告; 您的应用应该有相应策略来妥善应对用户拒绝访问权限的情况,并提示用户授予权限。

8.5K30

js Event Loop 运行机制

进程和线程基本概念 拿出在教科书里的概念: 1、调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位; 2、并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行; 3、拥有资源...我们看到浏览器自己会实现一些本地存储,cookie等,这些操作也需要分配一个进程。 ? 打开一个浏览器的tab页,他如果想要运行就需要系统分配给他cpu和内存资源,因此他需要分配一个进程。...当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行 注意:UI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被冻结了),UI更新会被保存在一个队列中等到...node js 是单线程的 和浏览器环境下类似,他有一个解析js的主线程,其他线程作为辅助,但是因为涉及操作dom,ui线程就不存在了。...执行时间队列里第一个宏任务时timeout1,遇到微任务promise,放到微任务队列中 timout1执行完成检查微任务,有内容则执行清空,执行promise。 清空微任务再执行宏任务。

1.7K40

Firebase Remote Config

什么是 Firebase Remote Config Firebase Remote Config 是一项云服务,可以更改 APP 的响应,而无需用户更新 APP。...,存储的任何模板的最长有效期为 90 天 Remote Config 默认和建议的生产提取间隔为 12 小时,这意味着无论实际上调用了多少次提取方法,在 12 小时的时间段内最多后端提取一次配置 Remote...以下规则用于确定在某个特定时间点 Remote Config 服务器提取哪个值 如果哪个条件值为 true,则读取对应的值 如果多个条件均为 true,则读取 Firebase 控制台显示的第一个...务必设置应用内默认参数值,确保应用始终按预期运行 实时传播 Remote Config 更新 与远程推送相结合 步骤 APP 订阅主题(以主题的形式给部分用户发送远程通知,如果需求区分用户群,直接发全部用户的远程通知即可...Remote Config 状态的信息 在客户端设置 Remote Config 状态 接收到推送通知,设置本地现有 Remote Config 为旧版,请求更新新的 Remote Config

40410

Flutter 3.0正式发布:稳定支持6大平台,字节跳动是主要用户

Flutter 和 Dart 的产品总监 Tim Sneath 发布博文中称,Flutter 3 完成了以移动为中心到多平台框架的发展路线图,现支持在 Linux 和 macOS 桌面的稳定运行,同时引入了...“我们希望帮助大家更灵活地利用底层操作系统,同时根据选择尽量重用原有 UI 和逻辑。”...3 开发周期中,团队为 Dart 完成了削减样板、提高可读性、为 RISC-V 架构提供实验性支持、升级 linter 和更新文档等工作。...Firebase 与 Flutter 应用程序的构建远不止于 UI 框架。应用程序发布者需要一整套工具来完成项目的构建、发布和运营,具体涵盖身份验证、数据存储、云功能和设备测试等服务。...具体包括将 Flutter 的 Firebase 插件升级至 1.0 版本,添加更好的文档和工具,并推出 FlutterFire UI 等新的功能部件、帮助开发者获得可重用的身份验证与配置界面 UI

7.4K20

【译】我是如何学习任意前端框架的

项目的条理是最简单到最全面。...某些页面只允许通过身份验证的用户(访问) 如何发送并保存JWT(JSON Web令牌)以发出需要经过身份验证的用户请求 3.CRUD App 增删查改的应用程序是本节中最受欢迎的前端应用程序,你可以使用本地存储或者使用在线服务...(如Firebase)来构建此应用程序,甚至将它与后端框架集成在一起。...但在本节中,我们尝试使用web sockets来构建聊天应用程序,它是双向的,我们不能(总是)等待响应来更新视图,我们需要另一种方法来管理我们的客户端状态。...你将学到: 学习如何使用管理状态解决方案,如redux for react, ngrx for angular 2+ 或 vuex for vuejs以及如何将其与客户端应用程序集成 使你的应用更灵活

3.6K10

javascript事件循环

标题中说的JavaScript单线程并不是说程序运行真的只是依赖一条线程,他实际有多条协助线程,只有一条主线程来调度协助线程,协助线程会用来做一些耗时任务,这样做是为了防止耗时任务阻碍了网页响应用户的操作...更新渲染(浏览器在一段时间内会将更新任务存放到渲染队列中去,直到时间到了,或者存储的量到达某个点的时候,就会释放,渲染页面。这样做是为了减少页面重排和重绘。...UI rendering阶段,直到第二轮loop最后才执行UI rendering 很显然结果一与上面说的event loop过程不一致,实际上浏览器在实现为了防止大量重排和重绘,在更新渲染过程做了优化...,让 UI rendering 并不是在每轮循环中都运行,UI rendering 执行时机具有不确定性,GUI线程中实际也存放了一个更新队列,当存放到一定时间、存放的数量到达临界值就会释放队列,还有一个情况也会迫使...Promise回调执行完以后才会更新渲染和执行宏任务(GUI线程和主线程是互斥的,当JavaScript主线程代码执行的时候,GUI线程会被挂起),浏览器可能对微任务数量做了限制,但是实际操作中没有测试出来

1.2K20

React Hooks 学习笔记 | useEffect Hook(二)

一、开篇 一般大多数的组件都需要特殊的操作,比如获取数据、监听数据变化或更改DOM的相关操作,这些操作被称作 “side effects(副作用)”。...}) }, []); // components/Ingredients/Ingredients.js 上述代码我们可以看出,我们使用 fetch 函数请求接口,请求完成我们更新...5.4 、更新删除清单的方法 这里我们要改写删除清单的方法,将删除的数据更新到云端数据库 Firebase ,为了显示更新状态和系统的错误信息,这里我们引入 ErrorModal ,添加数据加载状态和错误状态...5.5、更新添加清单的方法 接着我们改写添加清单的方式,通过接口请求的方式,将添加的数据添加至 Firebase 数据库,代码比较简单,就不多解释了,示例代码如下: const addIngredientHandler.../UI/Card"; import '.

8.2K30

全球顶级交易所前端二面

假如每秒同时有一千个人给你发很多消息,这个时候就要做任务调度了,因为这里面涉及到网络层、DB层、缓存层(前端内存,例如redux等),以及数据流向、更新频次与时机控制。 交易,同理。...在宏观上:我们可以同时打开多个应用程序,每个程序并行悖,同时运行。...如果这个过程很长,就会导致等待(卡顿)的时间很长 react16版本,react更新,会有一个Reconcilation阶段,这个阶段是会遍历虚拟dom树,找出更新的节点,完成一系列操作。...值小于或等于总任务个数时,进行并发控制 if (poolLimit <= array.length) { // 当任务完成正在执行的任务数组中移除已完成的任务 const...<= array.length) { // 当任务完成正在执行的任务数组中移除已完成的任务 const e = p.then(() => executing.splice

1.1K10
领券