承诺多次轮询直到不抛出错误

Have a promise that polls many times until error is not thrown

假设有一个承诺。 checkOnSomeValue() 并且在进程启动前的前两秒,promise checkOnSomeValue() 被拒绝了。然后在大约两秒钟后,promise 解析了一个值。

有没有办法包装一个 promise,这样 promise 就可以 运行 每 x 毫秒,然后在嵌套的 promise 解析时解析包装器 promise?

这是一种方法。

function waiter() {
  return new Promise((resolve) => {
    let interval = setInterval(() => {
      return client.getBalanceAsync('*', 6)
        .then(value => {
          clearInterval(interval)
          return resolve(value)
        })
        .catch((err) => {
        })
    }, 200)
  })
}

这是我会做的:

function poll(fn, ms) {
    return fn().catch(e => Promise.delay(ms).then(() => poll(fn, ms)));
}

基本上,尝试该功能,当它失败时等待 ms 毫秒,然后重试。

var polled = poll(checkOnSomeValue, 2000);

polled().then(v => {
  // your resolved value here ^_^
});

或者生成器 const co = Promise.coroutine:

const poll = co(function*(fn, ms) {
    while(true) {
      try {
        return yield fn();
      } catch (e) { 
        yield Promise.delay(ms);
      } // ignore rejections
    }
});

这样可以避免递归。

我基本上会选择 Benjamins answer,但实施方式略有不同:

function poll(fn, ms) {
    var resolve = () => fn().catch(retry);
    var retry = () => Promise.delay(ms).then(resolve);
    return resolve();
}

没什么大不了的。但出于某种原因,这个乒乓实现对我来说 better/cleaner/more 可读。甚至不能争论为什么。