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

在Angular 9中,为什么我的订阅是顺序加载而不是并行加载?

在Angular 9中,如果你发现订阅是顺序加载而不是并行加载,这通常是由于JavaScript的单线程特性以及Angular的变更检测机制所导致的。下面我将详细解释这一现象的基础概念,以及可能的原因和解决方案。

基础概念

  1. 单线程执行:JavaScript是单线程的,这意味着它一次只能执行一个任务。尽管有Web Workers可以在后台线程中运行代码,但它们并不适用于所有的异步操作,尤其是与DOM相关的操作。
  2. Angular变更检测:Angular使用变更检测机制来确保应用程序的状态与视图保持同步。每当事件触发(如用户交互、HTTP请求完成等),Angular会检查组件树中的所有绑定,并更新视图。

可能的原因

  • 同步代码执行:如果你的订阅是在同一个方法中顺序执行的,那么它们自然会按顺序加载。
  • 异步操作的串行化:即使使用了ObservablePromise,如果它们是在同一个方法中被连续调用,那么它们也会按顺序执行。
  • 变更检测的影响:Angular的变更检测可能会在每次异步操作完成后触发,这可能会导致后续的操作等待前一个操作完成。

解决方案

使用forkJoin进行并行加载

如果你有多个独立的HTTP请求或其他异步操作,并且希望它们并行执行,可以使用forkJoinforkJoin会等待所有的Observable完成后再发出值。

代码语言:txt
复制
import { forkJoin } from 'rxjs';
import { ajax } from 'rxjs/ajax';

const requests = [
  ajax.getJSON('/api/data1'),
  ajax.getJSON('/api/data2'),
  ajax.getJSON('/api/data3')
];

forkJoin(requests).subscribe(
  results => {
    console.log(results[0]); // data1
    console.log(results[1]); // data2
    console.log(results[2]); // data3
  },
  error => console.error(error)
);

使用mergeMapconcatMap

如果你需要按顺序处理异步操作的结果,但希望它们并行执行,可以使用mergeMap。如果你需要保持顺序,可以使用concatMap

代码语言:txt
复制
import { of } from 'rxjs';
import { mergeMap } from 'rxjs/operators';

of(1, 2, 3).pipe(
  mergeMap(id => ajax.getJSON(`/api/data/${id}`))
).subscribe(
  data => console.log(data),
  error => console.error(error)
);

使用async管道

在模板中使用async管道可以自动订阅Observable,并在数据到达时更新视图,这样可以减少手动管理订阅的需要。

代码语言:txt
复制
<div *ngFor="let item of items$ | async">
  {{ item.name }}
</div>
代码语言:txt
复制
import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { ajax } from 'rxjs/ajax';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'
})
export class AppComponent {
  items$: Observable<any>;

  constructor() {
    this.items$ = ajax.getJSON('/api/items');
  }
}

应用场景

  • 数据获取:当你需要从多个API端点获取数据时,使用forkJoin可以有效地并行加载数据。
  • 事件处理:在处理用户交互或其他事件时,使用mergeMapconcatMap可以帮助你管理异步操作的顺序和并发性。

通过上述方法,你可以更好地控制Angular应用程序中的异步操作,从而实现更高效的并行加载。

相关搜索:为什么我的PyGame图像存储在程序本地,而不是加载?为什么我的表显示在加载上,而不是我的图表上?为什么Google Chrome加载的是JPG而不是Avif和WebP?为什么我的字典的输出是随机的,混乱的顺序,而不是我想要的顺序(Python 3.8.3)?Angular -为什么我得到的是对象的对象,而不是对象的数组?为什么我的图像只在桌面上加载,而不在移动设备上加载?为什么我在CSS网格中得到的是列而不是行?在程序代码中手动加载我的数组而不是从文件中加载是不是一个好主意?为什么每次加载页面时,我的窗口滚动功能都会启动,而不是在每次更改时启动?为什么在PyGame中我得到的是空白的灰色背景而不是动画?为什么我的ViewModel在片段中是空的,而不是片段的绑定布局?JavaScript:为什么我在物主搜索代码中得到的是false而不是true?我有两个大的组件/屏幕,在链接按下元素后,我希望整个屏幕加载新的组件,而不是重新加载为什么在我的接收链中我得到的是KFunction1而不是List<E>?为什么我的图是分开显示的,而不是在同一张图上?我的Angular应用程序在gh页面上是空白的,无法从travis加载js为什么在执行git分支命令后,我看到的是see / master而不是master为什么Angular验证是在组件/表单中进行的,而不是在域模型上执行一次?为什么在cli上启用了ionCube加载器,而不是在osX EL-CAPITAN上的web上?为什么我在VS Code的左上角看到的是红色图标而不是json图标?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Angular进阶教程2-

依赖注入与HTTP的介绍 为什么使用服务?...依赖注入(DI) 依赖项( 服务/对象 )注入是一种设计模式,在这种设计模式中,类会从外部源请求依赖项\color{#0abb3c}{请求依赖项}请求依赖项而不是创建它们。...Angular在启动程序时会启动一个根模块,并加载它所依赖的其他模块,此时会生成一个全局的根注入器,由该注入器创建的依赖注入对象在整个应用程序级别可见,并共享一个实例。...// 这种方式注册,可以对服务进行一些额外的配置(服务类中也需要写@Injectable()装饰器)。 // 在未使用路由懒加载的情况下,这种注入的方式和在服务类中注入的方式是一样的。...,Angular会对延迟加载模块初始化一个新的执行上下文,并创建一个新的注入器,在该注入器中注入的依赖只在该模块内部可见,这算是一个特殊的模块级作用域。

4.2K30

实施前端微服务化的方式

由此带来的变化是,这些前端应用可以独立运行、独立开发、独立部署。以及,它们应该可以在共享组件的同时进行并行开发——这些组件可以通过 NPM 或者 Git Tag、Git Submodule 来管理。...结合我最近半年在微前端方面的实践和研究来看,微前端架构一般可以由以下几种方式进行: 使用 HTTP 服务器的路由来重定向多个应用 在不同的框架之上设计通讯、加载机制,诸如 Mooa 和 Single-SPA...Angular Tabs 示例 如果这一类应用过于复杂,那么它必然是要进行微服务化的拆分。因此,在采用 iframe 的时候,我们需要做这么两件事: 设计管理应用机制 设计应用通讯机制 加载机制。...在什么情况下,我们会去加载、卸载这些应用;在这个过程中,采用怎样的动画过渡,让用户看起来更加自然。 通讯机制。直接在每个应用中创建postMessage事件并监听,并不是一个友好的事情。...Web Components 中的 ShadowDOM 更像是新一代的前端 DOM 容器。而遗憾的是并不是所有的浏览器,都可以完全支持 Web Components。

1.2K10
  • Angular的12个经典问题,看看你能答对几个?(文末附带Angular测试)

    ngOnDestroy:在Angular销毁指令/组件之前清除。取消订阅可观察的对象并脱离事件处理程序,以避免内存泄漏。...什么是延迟加载?如何在Angular 2中启用延迟加载? 大多数企业应用程序包含用各式各样的用于特定业务案例的模块。捆绑整个应用程序代码并完成加载,会在初始调用时,产生巨大的性能开销。...如果应用程序较大时,我会考虑延迟加载而不是完全捆绑的应用程序。...但是预编译的应用程序会将所有模板和样式与组件对齐,因此到服务器的Http请求数量会更少。 更快的渲染:如果应用程序不是AOT编译,那么应用程序完全加载时,编译过程会发生在浏览器中。...如果服务器的HTTP请求结果或其它一些异步操作不再需要,则Observable的订阅者可以取消订阅,而Promise将最终调用成功或失败的回调,即使你不需要通知或其提供的结果。

    17.4K80

    Angular 1 vs. Angular 2 深度比较

    : 不清楚哪些监视器会运行,什么顺序,多少次 模型更新顺序难以推论和预期 摘要循环多次运行导致时间消耗 Angular 团队制定 Angular 2 开发方向时,其中一点是提取 Angular...这些模块的例子都不是异步加载的,以 AMD 模块为例,根据他们的依赖性列出第一次的加载所需的依赖。...而 Angular 2 则没有这样的问题,假如我们选择npm, 我们完全可以利用新型的ES6 模块加载器,ES6通过利用es6-module-loader pollyfill 使其变成一个标准的同步模块加载器...这时候看来 Angualr2 的这部分特征不是很清晰明朗,但是这种思路或许可以从以下几个方面得到体现: 启动开始, 同时所有的组件都被绑定 而渲染没有实现 一个页面在服务器被渲染后 , 然后发送到客户端...结论 我真的为 Angular 2 感到兴奋,在尝试几个组件之后,我可以看到它是如何的简单易学,对开发者更加透明。很多事情就像这个文章前面说过的,像 Zones 很容易使用。

    2.8K100

    浅谈HTML5单页面架构(一)——requirejs + angular + angular-route

    接下来,将分3个随笔分别介绍一下我心目中前3种架构的较好实施方案,而最后一种,跟前3种有种道不同不相为谋的感觉,加上自己道行不够,还是暂且不提了。...main.js,这个是由requirejs引入的第一个业务js,主要是配置requirejs; router.js,这个是整个网站/app的路由配置,在实际部署中,可以把main.js和router.js...data-baseurl是额外加入的属性,主要好处是可以轻松在html(0缓存)中对js的url进行修改。 data-main就是requirejs的标准写法了,跳过不说。...$template 首先,先修改一下angular-route的源代码,这个源代码非常精简,不用太纠结,狠狠的去修改就好了。 另外,想问我为什么知道或者想到在这修改?...最后最后,由于requirejs和angular都有模块管理,但两个概念又不一致,这里说说我的看法: requirejs模块管理,不单单是代码模块化,还提供了模块加载的功能; angular模块管理,更在乎的是代码逻辑上的模块化

    3.4K20

    2021Vue.js面试题汇总及答案【全网最全 建议收藏】「建议收藏」

    1.14.v-model 是如何实现的,语法糖实际是什么 1.15.data为什么是一个函数而不是对象 1.16.Vue template 到 render 的过程 1.17.Vue template...,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图 3.Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是: ①在自身实例化时往属性订阅器(dep)里面添加自己...="message" @input=" 1.15.data为什么是一个函数而不是对象 JavaScript中的对象是引用类型的数据,当多个实例引用同一个对象时,只要一个实例对这个对象进行操作,其他实例中的数据也会发生变化...MVVM和MVC都是一种设计思想,主要就是MVC中的Controller演变成ViewModel,,MVVM主要通过数据来显示视图层而不是操作节点,解决了MVC中大量的DOM操作使页面渲染性能降低,加载速度慢...mutation,而不是直接变更状态。

    8.7K30

    4、Angular JS 学习笔记 – 模块

    什么是模块? 你可以认为一个模块就是一个app的不同部分,controllers,services,filters,directives,等。 为什么?...这种方式有几个优势: 陈述性的过程容易理解 你可以打包代码为一个可复用的模块 这个模块可以以任意的顺序加载(甚至可以并行加载)因为模块是延迟执行的。 单元测试只需要加载相关的模块,保持快速。...; }; }); 注意很重要的几点: 模块的API 在中引用myApp模块。这个是告诉app使用你的模块。...angular.module('myApp', [])中的空数组是myApp模块的依赖组件 推荐的设置: While the example above is simple, it will not scale...我们还写了一个文档讲解如何组织大型的APP在google 。 上面的建议,根据你的需要使用。

    93420

    Angular项目实践

    今天主要和大家分享四个内容:第一,是为什么我们要选择 Angular;第二,是我们在使用 Angular 过程中总结的一些比较好的实践;第三,是怎样更好的组织项目结构;第四,是谈一下我对整合 Angular...首先我觉得世界上没有任何完美的框架,每一个框架都有自己的优点和缺点,而实践证明了 Angular 可以大幅提高我们的生产力,另外我们可以通过采用更好的实践来避免 Angular 的一些缺点。...上图是一个 Angular 简单的示意图,Angular 是有 Services 这个概念的,而 Services 可以注入到其他地方去。...这种划分方式是我在刚刚接触 Angular 的时候用的一个目录结构。...首先,是由于我们没有使用文件依赖库,因此在 Index.html 会引用一堆 JS 文件。有人说为什么你们不用像 requirejs 这样的第三方模块加载呢?

    1.2K70

    进阶 | 重新认识Angular

    , 因为它完全的依照AST生成,而不是在原Dom上的改写。...Vue使用的发布订阅模式,是点对点的绑定数据。 Proxy可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。...而Angular在某种程度上替我们做了这样的工作,并提供我们使用。 在Angular里面我们常常通过服务来共享一些状态的,而这些管理状态和数据的服务,便是通过依赖注入的方式进行处理的。...Rx不是允诺,它本质上还是由订阅/发布模式引出来的,它的核心思想就是数据响应式,源头是数据产生者,经过一系列的变换/过滤/合并的操作,被数据消费者所使用,数据消费者何时响应,完全取决于数据流何时能流下来...Rx的数据是否流出不取决于是否subscribe,也就是说一个observable在未被订阅的时候也可以流出数据,在之后它被订阅过后,先前的数据是无法被数据消费者所查知,所以Rx还引入了一个lazy模式

    2.6K10

    实施前端微服务化的六七种方式

    由此带来的变化是,这些前端应用可以独立运行、独立开发、独立部署。以及,它们应该可以在共享组件的同时进行并行开发——这些组件可以通过 NPM 或者 Git Tag、Git Submodule 来管理。...结合我最近半年在微前端方面的实践和研究来看,微前端架构一般可以由以下几种方式进行: 使用 HTTP 服务器的路由来重定向多个应用 在不同的框架之上设计通讯、加载机制,诸如 Mooa 和 Single-SPA...Angular Tabs 示例 如果这一类应用过于复杂,那么它必然是要进行微服务化的拆分。因此,在采用 iframe 的时候,我们需要做这么两件事: 设计管理应用机制 设计应用通讯机制 加载机制。...在什么情况下,我们会去加载、卸载这些应用;在这个过程中,采用怎样的动画过渡,让用户看起来更加自然。 通讯机制。直接在每个应用中创建 postMessage 事件并监听,并不是一个友好的事情。...而遗憾的是并不是所有的浏览器,都可以完全支持 Web Components。

    2.3K20

    谈谈前端性能优化

    作为一个前端开发者,前端性能优化问题是无可避免的。比如,你使用 vue 去开发一个运营活动的项目,首屏加载缓慢,你应该怎么办呢?又比如,你开发官网,你选择 ssr 还是 spa 呢?...本文,我们来聊聊遇到前端加载缓慢,应该怎么做~ 框架生命周期熟悉使用 现在前端框架已是三足鼎立 -- Angular,React 和 Vue。...我们在使用它们开发的过程中,应该了解相应框架的生命周期,而不是似懂非懂讲究用。...我们以 Angular 前端框架为例: 编程中,触发更改内容应该在 ngOnChanges 中调用,而不是在 ngDoCheck 中调用 订阅操作,应该在组件销毁的时候 ngOnDestroy 取消订阅...合理使用不同的域名获取请求 减少请求数,比如使用雪碧图,合并 CSS / JavaScript 文件 静态资源处理 所有的文件都有可能是静态资源,比如 Json, Image 等。

    34120

    博客系统知多少:揭秘那些不为人知的学问(四)

    在HTML5标准推广以后,搜索引擎更喜欢看标签类型来判断内容的含义,而不是根据标签里的内容来猜意思。...6.3丨MVC还是SPA 许多社区里写博客系统的程序员都偏向于使用SPA架构建博客,而鄙视用MVC,觉得落后,真的是这样吗?这个问题就像是飞机为什么不飞直线,是航空公司不会规划吗?...关于这一点,我曾经在以前的博客文章《我的 .NET Core 博客性能优化经验总结》中写过: 2014年以后,随着SPA的兴起,Angular等框架逐渐成为了前端开发的主流。...它们解决的问题正是提升前端的响应度,让Web应用尽量接近本地原生应用的体验。我也面临过不少朋友的质疑:为什么你的博客不用angular写?是你不擅长吗? ? 图 | 网络 其实并不是那么简单。...技术人员也不要觉得什么流行就得用什么,优秀的产品并不是堆砌时髦技术做出来的,而先得分析你的用户到底是怎么用你的产品,才能做最合适的选择。

    87010

    【AngularJS】—— 7 模块化

    首先先说一下为什么要实现模块化:   1 增加了模块的可重用性   2 通过定义模块,实现加载顺序的自定义   3 在单元测试中,不必加载所有的内容   之前做的几个例子,控制器的代码直接写在script...标签里面,这样声明的函数都是全局的,显然不是一个最好的选择。   ...下面看看如何进行模块化: var myAppModule = angular.module('myApp...创建模块myAppModule angular.module('myApp',[]);   第一个参数是绑定的应用app名称,这个app标识了页面中angular的入口点,类似main函数的作用。   ...在script中,我们通过模块创建了一个filter和一个控制器。   filter的作用是 添加字符串修饰。   控制器的作用则是初始化变量。   程序的运行结果如下: ?

    51350

    微前端:软件开发的模块化新视野

    通信机制模块之间的通信是微前端架构的核心挑战之一。为了实现模块的松耦合,微前端通常使用以下通信机制:事件机制:模块之间通过发布和订阅事件进行通信。...独立部署需求在频繁迭代的产品开发中,不同模块可能有不同的发布周期。微前端允许单个模块快速上线,而无需重新部署整个应用。例如,一个新闻门户网站需要快速发布热点新闻模块的更新,而评论模块可以延后部署。...微前端的优势与挑战优势提升开发效率:团队可以并行开发,减少开发周期。增强代码可维护性:每个模块的代码库相对独立,复杂度降低。灵活的技术选择:不同模块可以选择最佳技术栈,而不受全局技术限制。...支持渐进式迁移:在迁移技术栈或重构时,可以逐步替换旧模块,而非一次性重写整个系统。挑战性能问题:由于每个模块可能加载独立的资源文件(如 CSS 和 JavaScript),可能导致初始加载时间增加。...尽管各模块使用不同的技术栈(如巴西站点使用 Angular,而美国站点使用 React),通过微前端,他们成功实现了以下目标:快速本地化:各团队可以根据本地需求快速调整界面和功能。

    5600

    Angular2学习记录-给后端程序员的经验分享

    这里就要说下个人观点了,安利一波:我认为每个程序员都应该有自己的一个项目,一个可以让你学习的东西能施展到上面的项目,可能该项目一开始很简单,但是随着你不断的学习,不断的把新知识运用进去,这个项目就会伴随着你的成长而丰富起来...,给你带来的则是更多的实战经验. 2.angular2简介 angular2是类似全家桶组合的框架,所需要的东西几乎都包办了,所以开发起来很迅速....isAddBackColor(){ if (this.getIsIndex()){ var self = this; //该处使用匿名函数,而不是箭头函数....任意组件:使用service通讯(要求service单例),service提供Observable的next发布,其他组件引用service对象subscribe该发布,那么就实现了信息的流动,并且是在只要订阅了该发布的组件中都能获取...这是因为访问主域名后angular的js都已经全部加载了,这个时候跳转是js来控制的,不经过nginx自然不会出现上面的问题.

    3.1K20

    Angular-内存溢出的问题

    本项目用的是angular6搭建,用动态组件的形式来显示页面,之前遇到过因为内存溢出而导致无法aot的问题, Angular4以上的该方法都适用 解决方法:手动改写内存上限 修改目录: my-project..._@angular_compiler-cli@4.0.1@@angular\compiler-cli\src\main.js" %* ) 至于到底是什么原因导致的内存溢出,还不清楚,只是有如下猜测: 1...)文件过多; 2)订阅数据没有销毁占用内存,(看了下订阅的数据很少,应该不是的); 3)因为所有的组件都在一个根目录下(上面说了,用的动态组件没用路由),导致需要编译的组件过多?...暂时还不清楚只能先用设置内存上限的方法来解决,有大神的话望不吝指教; 还有一个问题就是用动态组件的方式,组件都在根目录下,会导致首次加载的时间过长。...有奇思妙想请告诉我,哈哈 同时package的时候也需要修改打包时候的内存 package.json { "name": "pms", "version": "0.0.0", "scripts

    2.4K20

    angular面试题及答案_angular面试

    生命周期钩子 生命周期的顺序,见下图: ngOnChanges:当组件数据绑定的输入属性发生变化是触发,该方法接收一个SimpleChanges对象,包括当前值和上一个属性值。...,而directive用来在已经存在的DOM元素上实现一些行为 component是可重复使用的组件,directive是可重复使用的行为 component可创建一个view,即template或templateUrl...是输入属性发生变化的时候调用,并且ngOnInit是在ngOnchanges执行之后才调用,而constructor是在组件实例化的时候就调用了,也就是说,在constructor中是取不到输入属性的值的...Angular的懒加载 默认情况下,在初始化的时候所有路由都会加载,导致加载缓慢,启动速度慢,所以可以使用懒加载 懒加载 : 通俗 的讲就是进入主模块之后,子模块不加载,等真正访问到子模块之后,再去加载...6)如果应用程序较大时,我会考虑延迟加载而不是完全捆绑的应用程序。 27. 使用Angular的好处 可以添加自定义的directive. 优秀的社区支持。 客户端和服务器的通讯非常便利。

    11.3K120

    前端面试题库系列(4)

    是“渲染完再执行”,async 是“下载完就执行”,defer 如果有多个脚本,会按照在页面中出现的顺序加载,多个async 脚本不能保证加载顺序 加载 es6模块的时候设置 type=module...(在函数中一般等于this) JavaScript 事件委托详解 线程,进程 线程是最小的执行单元,进程是最小的资源管理单元 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程...angular 双向数据绑定与vue数据的双向数据绑定 二者都是 MVVM 模式开发的典型代表 angular 是通过脏检测实现,angular 会将 UI 事件,请求事件,settimeout...标签会停下来,等到执行完脚本,继续向下渲染 defer 是“渲染完再执行”,async 是“下载完就执行”,defer 如果有多个脚本,会按照在页面中出现的顺序加载,多个async 脚本不能保证加载顺序...9、vue双向绑定原理及响应式原理 10、vue有几个生命周期,分别是什么,每个生命周期能干什么 11、vue中data为什么要return一个对象,而不是直接一个对象 12、computed和function

    1.3K10
    领券