承诺多次轮询直到不抛出错误
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 可读。甚至不能争论为什么。
假设有一个承诺。 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 可读。甚至不能争论为什么。