JS Angular 服务器端渲染应用设置渲染超时时间​​​​​​​

 更新时间:2022年06月27日 09:13:37   作者:​ JerryWang_sap   ​  
这篇文章主要介绍了JS Angular服务器端渲染应用设置渲染超时时间,​​​​​​​通过setTimeout模拟一个需要5秒钟才能完成调用的API展开详情,需要的小伙伴可以参考一下

我们用 setTimeout 模拟一个需要 5 秒钟才能完成调用的 API:

const express = require('express');
const app = express();
app.get('/api/fast', (req, res) => {
  console.log('fast endpoint hit');
  res.send({response: 'fast'});
});
app.get('/api/slow', (req, res) => {
  setTimeout(() => {
      console.log('slow endpoint hit');
      res.send({response: 'slow'});
  }, 5000);
});
app.listen(8081, () => {
  console.log('Listening');
});

然后新建一个 Angular service,调用这个 /api/slow:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
 providedIn: 'root'
})
export class CustomService {
 constructor(private http: HttpClient) {}
 public getFast(): Observable<any> {
   return this.http.get<any>('http://localhost:8081/api/fast');
 }
 public getSlow(): Observable<any> {
   return this.http.get<any>('http://localhost:8081/api/slow');
 }
}

在服务器端渲染模式下,等待这个 API 调用的返回,至少需要花费 5 秒钟。我们可以给这个 API 调用设置一个超时机制。如果服务器端渲染时超过我们指定的超时间隔,还没有得到 API 响应,我们就放弃这次 API 调用,让其在客户端渲染模式下继续进行。

我们使用 RouteResolver 来实现。

从 Angular route 框架导入 router

import { Resolve } from '@angular/router';

从 Angular common 开发包导入 Angular 运行环境监测的 API:

import { isPlatformBrowser } from '@angular/common';

导入 injection token,获得当前运行的 platform id:

import { Injectable, Inject, PLATFORM_ID } from '@angular/core';

新建一个 service class:

import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
import { Resolve } from '@angular/router';
import { Observable, timer } from 'rxjs';
import { isPlatformBrowser } from '@angular/common';
import { CustomService } from './custom.service';
import { takeUntil } from 'rxjs/operators';
@Injectable({
 providedIn: 'root'
})
export class SlowComponentResolverService implements Resolve<any> {
 constructor(private service: CustomService, @Inject(PLATFORM_ID) private platformId: any) { }
 public resolve(): Observable<any> {
   if (isPlatformBrowser(this.platformId)) {
     return this.service.getSlow();
   }

如果当前应用运行于浏览器端,上图的 isPlatformBrowser(this.platformId) 返回 true,因此直接调用慢速 API.

否则创建一个 Observable,500 毫秒后发射值:

const watchdog: Observable<number> = timer(500);

我们将这个 watchDog Observable 通过 pipe 设置到 this.service.getSlow 的下游。这样,如果 this.service.getSlow() 返回的 Observable 在 500 毫秒之内不 emit 值的话,watchdog 就会向 Component push null 值,否则,API 的真实 response 会推送给 Component.

我们需要更新应用相关的 routing 代码来消费这个 Resolver.

给 slowComponent 分配一个 resolver:

const routes: Routes = [
{path: '', redirectTo: 'fast', pathMatch: 'full'},
{path: 'fast', component: FastComponent},
{path: 'slow', component: SlowComponent, resolve: {response: SlowComponentResolverService}}
];

在 slowComponent 的实现代码里,从分配的 Route resolver 里读取 API response 数据:

import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-slow',
template: `
  <p>
    Response is: {{response | json}}
  </p>
`,
styles: []
})
export class SlowComponent {

public response: any = this.router.snapshot.data.response;
constructor(private router: ActivatedRoute) {}
}

注意这里并没有直接访问 Route Resolver:this.router.snapshot.data.response

当 API 在 500 毫秒之内返回时,所有的 slowComponent 源代码都由服务器端生成:

当 API 500 毫秒未能成功返回数据,则客户端会再次调用该 API,然后在客户端完成渲染:

到此这篇关于JS Angular 服务器端渲染应用设置渲染超时时间的文章就介绍到这了,更多相关JS Angular 服务器端渲染内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js判断浏览器类型的方法

    js判断浏览器类型的方法

    这篇文章介绍了js判断浏览器类型的方法,有需要的朋友可以参考一下
    2013-08-08
  • Bun运行时是新一代高性能JavaScript/TypeScript运行时

    Bun运行时是新一代高性能JavaScript/TypeScript运行时

    Bun由Jarred Sumner创建,是一款新兴的JavaScript和TypeScript运行时,旨在比Node.js和Deno提供更高性能和快速启动,Bun使用Zig语言编写,内置包管理并支持Node.js大部分API,适用于高并发API服务和快速构建工具
    2024-11-11
  • javascript实现秒表计时器的制作方法

    javascript实现秒表计时器的制作方法

    这篇文章主要为大家详细介绍了javascript实现秒表计时器的制作方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • wow.js实现炫酷的页面滚动伴随动画示例详解

    wow.js实现炫酷的页面滚动伴随动画示例详解

    这篇文章主要为大家介绍了wow.js实现炫酷的页面滚动伴随动画示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JS简单随机数生成方法

    JS简单随机数生成方法

    这篇文章主要介绍了JS简单随机数生成方法,通过javascript自定义函数演示了随机数的生成方法,需要的朋友可以参考下
    2016-09-09
  • javascript中验证大写字母、数字和中文

    javascript中验证大写字母、数字和中文

    本文为大家介绍下使用javascript验证大写字母小写字母,数字和中文,具体示例如下
    2014-01-01
  • js字符串倒序的实例代码

    js字符串倒序的实例代码

    这篇文章主要介绍了js字符串倒序的实例代码,代码分为3部分,给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • 解决layui的使用以及针对select、radio等表单组件不显示的问题

    解决layui的使用以及针对select、radio等表单组件不显示的问题

    今天小编就为大家分享一篇解决layui的使用以及针对select、radio等表单组件不显示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 支付宝小程序实现类似微信多行输入功能(思路详解)

    支付宝小程序实现类似微信多行输入功能(思路详解)

    这篇文章主要介绍了支付宝小程序实现类似微信多行输入功能,输入超过 8 行的时候会出现滚动,这样做的好处就是输入框不会直接顶到页面最顶部,支付宝小程序实现多行输入框:使用textarea多行输入框实现,感兴趣的朋友一起看看吧
    2024-02-02
  • javascript+html5实现绘制圆环的方法

    javascript+html5实现绘制圆环的方法

    这篇文章主要介绍了javascript+html5实现绘制圆环的方法,实例分析了javascript实现html5基于canvas绘制圆环的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论