- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Angular 7 docs提供了rxjs
Observable
s在实现AJAX请求的指数补偿时的实际用法示例:
import { pipe, range, timer, zip } from 'rxjs';
import { ajax } from 'rxjs/ajax';
import { retryWhen, map, mergeMap } from 'rxjs/operators';
function backoff(maxTries, ms) {
return pipe(
retryWhen(attempts => range(1, maxTries)
.pipe(
zip(attempts, (i) => i),
map(i => i * i),
mergeMap(i => timer(i * ms))
)
)
);
}
ajax('/api/endpoint')
.pipe(backoff(3, 250))
.subscribe(data => handleData(data));
function handleData(data) {
// ...
}
retryWhen
将如何精确计算出重新订阅源
ajax
的时间间隔。
zip
,
map
和
mapMerge
在此设置中如何工作?
attempts
对象发射到
retryWhen
中时,它将包含什么?
最佳答案
我花了很多时间对此进行研究(出于学习目的),并将尝试尽可能全面地解释此代码的工作原理。
首先,这是原始代码,带注释:
import { pipe, range, timer, zip } from 'rxjs';
import { ajax } from 'rxjs/ajax';
import { retryWhen, map, mergeMap } from 'rxjs/operators';
function backoff(maxTries, ms) { // (1)
return pipe( // (2)
retryWhen(attempts => range(1, maxTries) // (3)
.pipe(
zip(attempts, (i) => i), // (4)
map(i => i * i), // (5)
mergeMap(i => timer(i * ms)) // (6)
)
)
); // (7)
}
ajax('/api/endpoint')
.pipe(backoff(3, 250))
.subscribe(data => handleData(data));
function handleData(data) {
// ...
}
backoff
运算符之外创建了自定义retryWhen
运算符。我们稍后将可以在pipe
函数中应用此功能。 pipe
方法返回一个自定义运算符。 retryWhen
运算符。它带有一个函数参数。该函数将被调用一次-特别是在首次遇到/调用此retryWhen
时。顺便说一下,retryWhen
仅在可观察的源产生错误时才起作用。然后,它可以防止错误进一步传播并重新订阅源。如果源产生非错误结果(无论是第一次订阅还是重试),retryWhen
将被传递并且不涉及。attempts
的几句话。这是可以观察的。这不是可观察到的源。它是专门为retryWhen
创建的。它只有一种用途:只有可观察到的对源可观察项的订阅(或重新订阅)导致错误时,attempts
会触发next
。我们获得了attempts
并可以自由使用它,以便以某种方式对可观察到的源订阅的每次失败尝试使用react。range(1, maxTries)
,它是一个可观察的对象,对于我们愿意执行的每次重试,它都有一个整数。 range
准备随时随地发射所有数字,但是我们必须坚守一道:只有在发生其他重试时,我们才需要一个新数字。因此,这就是我们... attempts
压缩它。含义,将每个attempts
的发射值与单个range
值相结合。attempts
将仅触发一次next
。因此,在这一点上,我们的两个压缩观测值仅产生了一个值。(i) => i
。为了清楚起见,可以将其编写为(itemFromRange, itemFromAttempts) => itemFromRange
。第二个参数未使用,因此被删除,第一个被重命名为i
。attempts
触发的值,我们只对它们被触发的事实感兴趣。每当发生这种情况时,我们都会从range
observable中提取下一个值... attempts
作为输入返回一个可观察值。此结果可观察到的对象仅构建一次。然后retryWhen
订阅该结果可观察到的内容;并且:每当结果可观察到的结果触发next
时,重试订阅源可观察的内容;每当可观察到的结果触发那些相应事件时,在可观察到的源上调用complete
或error
。 retryWhen
等待一段时间。可以使用 delay
运算符,但是设置延迟的指数增长可能会很痛苦。而是mergeMap
运算符起作用。mergeMap
是组合了两个运算符的快捷方式:map
和mergeAll
。 map
只是将每个递增的整数(1、4、9、16 ...)转换为可观察到的timer
,它会在经过毫秒数后触发next
。 mergeAll
强制retryWhen
实际订阅timer
。如果最后一点没有发生,我们得到的observable将立即以next
observable实例作为值触发timer
。 retryWhen
将使用它来决定何时确切尝试重新订阅源Observable。 next
(导致了最后一次尝试重新订阅),它也会立即触发complete
。除非源可观察到的返回结果非常迅速(假设最后一次重试将是成功的),否则该结果将被忽略。retryWhen
一旦从我们的观察对象中听到complete
,就会在源代码上调用complete
,这可能仍在发出AJAX请求的过程中。 complete
而不是更合乎逻辑的error
。 error
。
zip
中弃用
rxjs v6
运算符:
import { delay, dematerialize, map, materialize, retryWhen, switchMap } from "rxjs/operators";
import { concat, pipe, range, throwError, timer, zip } from "rxjs";
function backoffImproved(maxTries, ms) {
return pipe(
retryWhen(attempts => {
const observableForRetries =
zip(range(1, maxTries), attempts)
.pipe(
map(([elemFromRange, elemFromAttempts]) => elemFromRange),
map(i => i * i),
switchMap(i => timer(i * ms))
);
const observableForFailure =
throwError(new Error('Could not complete AJAX request'))
.pipe(
materialize(),
delay(1000),
dematerialize()
);
return concat(observableForRetries, observableForFailure);
})
);
}
关于javascript - 使用rxjs实现指数补偿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53015170/
如何根据 e(公钥)、d(私钥)和模数计算 p 和 q 参数? 我手边有 BigInteger 键,我可以将粘贴复制到代码中。一个公钥、一个私钥和一个模数。 我需要据此计算 RSA 参数 p 和 q。
如何在 JavaScript 中计算指数? 比如你会怎么做 12^2? 最佳答案 Math.pow() : js> Math.pow(12, 2) 144 关于JavaScript 指数,我们在Sta
也许是时候喝一杯咖啡了,但我看到了一个我没想到会看到的奇怪问题。 我正在阅读 JavaScript The Good Parts,在语法部分我看到以下内容: If a number literal h
我正在使用带有 eclipse link 2.3 &Derby db 的实体管理器 JPA,并且我有包含 10 个实体的模型,对于每个实体,我需要存储 1000 条记录,此过程大约需要 70 秒。我已
我习惯了制作 iPhone 应用程序,但现在我需要制作 Mac 应用程序。因此我必须切换到 Cocoa 框架。 有没有类似于 Cocoa 中的 array.index(of: ) 的东西? iOS 示
我正在尝试在控制台中打印文件名“xyz.0.html”。它吐出一个错误 "substring not found" 目录中的文件: xyz.0.html xyz.1.html xyz.2.html p
我需要计算 h-index来 self 存储在树中的出版物列表。 我所做的是按递减顺序遍历树,获取引用位置列表 看起来像: line 1 10 line 2 5 line 3 4 line 4 0 我
有没有一种更简单的方法将幂符号/指数符号转换为其等价数字(即从 ⁸ 到 8),而不仅仅是一堆 replace是吗? 编辑:谢谢大家的解决方案! 最佳答案 您可以创建一个正则表达式并执行一次 repla
我编写这段代码是为了查找指数 b 的最后一位数字,但 SPOJ 说它是错误的。我尝试了几乎所有的测试用例,但找不到错误。问题:http://www.spoj.com/problems/LASTDIG/
我对 CSS 中的 z-index 有疑问。 代码: div.banniere{ background-image:url('../img/banniere.png'); backgr
我有一个弹出的“对话框”小部件,其 z-index 为 100。当我创建另一个弹出窗口( float div)时,它出现在对话框小部件下方,因为我没有明确设置 z -新弹出窗口的索引。 结构最终看起来
我正在尝试从一篇学术论文中实现一个真相发现算法。它是一种流式算法,可以实时推断真相和源质量。如果有人有兴趣阅读本文,请在此处了解更多详细信息:http://dl.acm.org/citation.cf
这个问题在这里已经有了答案: Difference between Big-O and Little-O Notation (5 个答案) 关闭 8 年前。 直观上,nb = o(an)(o 是小哦
我在这里使用 sklearn 制作了一个决策树,在 SciKit learn DL 包下,即。 sklearn.tree.DecisionTreeClassifier().fit(x,y)。 如何在每
为了解释这一点,这基本上是一种将浮点向量数据缩小为 8 位或 16 位有符号或无符号整数的方法,该整数具有单个公共(public)无符号指数(最常见的是 bs16 以 11 为常用指数的精度)。 我不
是否可以在 Algolia 中“加入”索引?获得合并结果? 例如: 如果我有两个索引:一个用于“用户”,一个用于“事件”。每个用户都有 id 和 name 属性。每个事件都有 date 和 userI
有人可以提供一个关于如何在 pytorch 中为语义分割计算 IoU(交集对联合)的玩具示例吗? 最佳答案 我在某处找到了它并为我改编了它。如果我能再次找到它,我会发布链接。抱歉,如果这是重复的。 这
我正在将 NativeBase 与指数一起使用。标题位于手机的状态栏下方。您可以在 NativeBase 中看到这一点指数发布的演示。 有没有人解决这个问题? 最佳答案 由于此问题仅在 Android
基本上,有20只羊为一组。当羊群发展到80只羊后,就不再需要有人看管了。每年 t 的羊数量 N 可以通过以下公式找到: N = 220/(1 + 10(0.83)^t) 该程序试图找出羊需要被监管多少
我正在尝试编写一个 SPARQL 查询,我想在其中过滤某些内容的平方,但我根本无法弄清楚如何计算数字的平方(x2)(当然,除了将其与自身相乘之外)。我猜想有一个名为 math:sqrt() 的平方根函
我是一名优秀的程序员,十分优秀!