約束があるとしましょう。 checkOnSomeValue()
となり、処理が始まる前の最初の2秒間約束checkOnSomeValue()
は拒否されます。そして、約2秒後に約束が値を解決します。エラーがスローされなくなるまで何度も投票するという約束がある
プロミスがxミリ秒ごとに実行され、ネストされた約束が解決されたときにラッパーの約束を解決できるように約束する方法はありますか?
約束があるとしましょう。 checkOnSomeValue()
となり、処理が始まる前の最初の2秒間約束checkOnSomeValue()
は拒否されます。そして、約2秒後に約束が値を解決します。エラーがスローされなくなるまで何度も投票するという約束がある
プロミスがxミリ秒ごとに実行され、ネストされた約束が解決されたときにラッパーの約束を解決できるように約束する方法はありますか?
は私がどうなるのかです:
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
}
});
。
ここには1つの方法があります。ここで
function waiter() {
return new Promise((resolve) => {
let interval = setInterval(() => {
return client.getBalanceAsync('*', 6)
.then(value => {
clearInterval(interval)
return resolve(value)
})
.catch((err) => {
})
}, 200)
})
}
ここで 'setInterval'を使うのではなく、' setTimeout'を使うべきです。そうでなければ、 'getBalanceAsync'が' 200ms'より長く続くならば、約束を '解決する'でしょう。 –
'setTimeout'は約束を一度呼び出すつもりです。私はそれを複数回呼び出す方法が必要です。 – ThomasReggi
これは延期された反パターンです。よろしくお願いします。 –
私はBenjamins answerと基本的には行くが、わずかに異なる実装ではと思います:
function poll(fn, ms) {
var resolve =() => fn().catch(retry);
var retry =() => Promise.delay(ms).then(resolve);
return resolve();
}
大したこと。しかし、何らかの理由で、このピンポンの実装は、私にとってより良い/きれいに/わかりやすく感じます。理由を説明することさえできません。
あなたはあなたの例をより明示できますか?いくつかのサンプルコードは素晴らしいでしょう – Yerken