如何连续执行异步功能,而不是仅与流中的最新功能并行执行

时间:2017-02-21 12:37:14

标签: javascript rxjs rxjs5

我好几天都遇到了rxjs问题。我将rxjs与REACT一起使用并尝试获取属性更改流以运行异步函数来快进/快退播放器。然后进一步等待任何函数调用,直到回调返回。如果在等待回调时流中发生任何属性更改,则执行最后一个。然后重复这个过程。

以下是一个示例代码。 http://jsbin.com/jagoworawu/edit?js,console

const setCurrentTimeStream = Observable.bindNodeCallback(player.setCurrentTime);

// Instant execute setCurrentTimeStream on first iteration.
// Prevent next setCurrentTimeStream if not callback of previous setCurrentTimeStream was called.
// Skip all except last while waiting for setCurrentTimeStream callback and then execute it.
// Then repeat the process.
const lifecycle$ = props$
  .distinctUntilKeyChanged('currentTime')
  // tried with audit and throttle but it won't execute the last one
  .audit(({ currentTime }) => setCurrentTimeStream(currentTime));
  // Probably needs something more here?

修改: 在阅读了一些文档后,我想出了这个。请提供反馈或其他解决方案,最好使用rxjs的本地方法。

const latestExecAsync = (input, action) => Observable.create((observer) => {
  let queued = false;
  let latestValue;
  const dequeue = (reference) => {
    queued = true;
    action(reference.value, (error, value) => {
      if (error) return output.error(error);
      observer.next(reference.value);
      if (reference !== latestValue) {
        dequeue(latestValue);
      } else {
        queued = false;
      }
    });
  };
  const subscription = input.subscribe({
    next: (value) => {
      const reference = latestValue = { value };
      if (!queued) dequeue(reference);
    },
    error: e => observer.error(e),
    complete: () => observer.complete(),
  });
  return () => subscription.unsubscribe();
});

// Usage:
latestExecAync(
  props$.distinctUntilKeyChanged('currentTime'),
  ({ currentTime }, cb) => player.setCurrentTime(currentTime, cb)
)

1 个答案:

答案 0 :(得分:0)

我终于想出了我正在寻找的行为。仅使用rxjs本机方法。 :)

$dates = ([DateTime] "1/1/2016"),([DateTime] "1/2/2016"),
  ([DateTime] "2/1/2016"),([DateTime] "3/1/2016")
$uniqueMonths = $dates | ForEach-Object { $_.Month } | Sort-Object -Unique
# $uniqueMonths contains 1,2,3

http://jsbin.com/wedefojuyo/edit?js,console,output