【问题标题】:Calmm-way of doing async requests with interval?以间隔进行异步请求的冷静方式?
【发布时间】:2017-06-15 10:20:48
【问题描述】:

以间隔执行重复(无限)异步作业的最优雅的方式(Calmm stack, Kefir, Karet Utils etc.)是什么?

我想get2000ms 一个json。

示例 1(2000ms 间隔):

  1. 获取 json(get 需要 100 毫秒)
  2. 处理json
  3. 等待间隔剩余的时间,然后从步骤 1 重新开始

示例 2(2000 毫秒间隔)

  1. 获取 json(get 需要 5000 毫秒)
  2. 处理json
  3. 等到第 1 步和第 2 步完成后再从第 1 步开始

简而言之,我想重复gets(或任何异步工作)并在请求之间至少等待2000ms

我不希望在前一个请求以某种方式完成(成功、失败、超时)之前触发下一个请求。

【问题讨论】:

  • 只是好奇,什么是“冷静”?或者 Kefir,或者 Karet Utils?
  • 这是关于 AngularRXJS 但主要概念是完全一样的,所以,我认为这里已经回答了:stackoverflow.com/questions/44540703/…
  • @evolutionxbox 你可以在这里查看平静github.com/calmm-js/documentation/blob/master/…
  • @evolutionxbox Calmm 是一个功能性的反应式 JavaScript 框架/工具集,习惯性地与 React 结合使用,但也可以与 preact 和可能的其他 vdom 库一起使用。 Calmm 可以将 observables 直接嵌入到 vdom 中。 Calmm 工具集由几个库组成,包括 partial.lenses(一个功能性镜头库)和 karet.util(基于 Kefir 的 observables 实用程序库,包括一些 Ramda)。 Kefir 是一个 observables(流和属性)库。 Ramda 是一个流行的库,它促进了函数式编程风格。

标签: javascript asynchronous reactive-programming kefir.js calmm


【解决方案1】:

这就是我在不诉诸 Kefir.stream 的情况下使用 Kefir 的方式。请注意,下面的job 将是您在每个滴答时执行的任务。我为代码工作存根了一个虚拟任务。

let result = Kefir.repeat(() => {
    let job = Kefir.later(Math.random() * 5000);
    let wait = Kefir.later(2000).ignoreValues();
    return Kefir.merge([job, wait]);
});

下面是使用 Kefir 文档中的样式对事件进行的可视化:

spawned 1 - job:   ------1X
spawned 1 - wait:  -----------X
spawned 1 - merge: ------1----X
spawned 2 - job:               ------------------2X
spawned 2 - wait:              -----------X
spawned 2 - merge:             ------------------2X
spawned 3 - job:                                   ---3X
spawned 3 - wait:                                  -----------X
spawned 3 - merge:                                 ---3-------X
result:            ------1-----------------------2----3--------...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2015-08-08
    • 2019-07-12
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多