国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

使用RxJS更優雅地進行定時請求詳析

2019-11-19 11:24:57
字體:
來源:轉載
供稿:網友

在用 Angular 做項目的時候,遇到了一個有點麻煩的問題。具體問題如下:

輪循請求某個接口,如何保證接口返回的數據與請求的順序相同?

實際的業務場景是這樣的:前端需要輪循請求后端接口獲取文件處理進度,并在前端用進度條展示。如下方所示:

首先想到的肯定是使用 setTimeout 或者 setInterval 進行定時請求。然而結果有點詭異,進度條的變化不是遞增,而是有快有慢,比如 30%,20%,50%,40%這樣。仔細一想也知道問題出在哪,異步請求的結果并不是按順序返回的。

我在之前的工作中還沒有遇到過這類需求,所以我并不是很清楚如果用傳統方式應該如何解決。然而很慶幸的是 RxJS 正好擅長處理這樣的問題。我立即翻了一下文檔,interval 操作符可以處理定時任務,而且更強大的是返回結果也是有順序的。

interval(period: 0 = 0, scheduler: SchedulerLike = async): Observable<number>

首先看一下 interval 的說明:

創建一個可觀察對象,在規定的調度程序中,以規定的時間間隔發出連續的數值。

interval 返回一個可觀察對象,它可以周期性的發出遞增數值,但是第一次發出值是在第一個周期結束之后執行的。

以下是官方例子:

import { interval } from 'rxjs';import { take } from 'rxjs/operators';const numbers = interval(1000);const takeFourNumbers = numbers.pipe(take(4));takeFourNumbers.subscribe(x => console.log('Next: ', x));// Logs:// Next: 0// Next: 1// Next: 2// Next: 3

不過只看官方例子還是有點懵,如果是 http 請求的話應該怎么寫參數呢?或者說應該把 http 請求寫在哪里?

這個地方的坑有點深,通過翻閱外文資料終于找到答案。直接上代碼。

// 間隔 1s 請求this.timer$ = interval(1000)  .pipe(    // 取消過時的請求值    switchMap(() => {      return this.http.get(API);    }),  )  .subscribe(    (res: any) => {      // 百分數處理邏輯    },    () => {      this.timer$.unsubscribe();    },    () => {      this.timer$.unsubscribe();    },  );

總的來說就是通過管道處理請求。最終的效果很完美。

總結

RxJS 確實是一個非常強大的工具庫,尤其處理異步交互真的是省時省力,但是國內技術文章偏少,遇到疑難問題還需要查閱國外文章。歡迎大家評論交流。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平邑县| 蓝田县| 贞丰县| 兴山县| 安吉县| 临邑县| 普格县| 白河县| 庆城县| 廉江市| 日喀则市| 五河县| 黄大仙区| 韩城市| 关岭| 静乐县| 左贡县| 竹山县| 慈利县| 尼木县| 来宾市| 陇南市| 陕西省| 于田县| 镇远县| 齐齐哈尔市| 灵寿县| 咸丰县| 新宁县| 库尔勒市| 灵璧县| 仪征市| 九寨沟县| 雷州市| 贵阳市| 民乐县| 武胜县| 万山特区| 东港市| 文登市| 奉贤区|