私はクライアントから呼び出されるmyMainFunction
という関数を持っています。つまり、mypromisified
という関数が呼び出されます。Javascript.Promise.rejectで再試行するか、または成功するまで
シナリオ: mypromisified
機能が断続的に失敗することができ、私は達し試行のない成功するまで、または最大まで(指数関数的な増加で)遅延でこの関数を呼び出していないする必要があります。私が持っているもの
は、これまで
次のコードは、私のシナリオを示し、成功、まで繰り返されますが、特定のカウントが到達するまで、それは無期限ではなくしようと
// called once from the client
myMainFuntion();
function rejectDelay(delay, reason) {
// call main function at a delayed interval until success
// but would want to call this only a limited no of times
setTimeout(() => {
myMainFuntion(); // calling main function again here but with a delay
}, delay);
}
function myMainFuntion() {
var delay = 100;
var tries = 3;
tryAsync().catch(rejectDelay.bind(null, delay));
}
function tryAsync() {
return new Promise(function(resolve, reject) {
var rand = Math.random();
console.log(rand);
if (rand < 0.8) {
reject(rand);
} else {
resolve();
}
});
}
while
ループ内部rejectDelay
は、setInterval内の実際の関数が実行される前でもカウンタがインクリメントするため、確かに機能しません。このため、どうすればよいでしょうか?そう...
私はpromisifying
にそれが右のいずれかにそれを取得する方法を確認してください、それはカウンタをデクリメントdoesntのよう:(失敗しませんが、知っている、このようなsetInterval
な何かを試してみました。
function rejectDelay(delay, maximumTries, reason) {
return new Promise(function (resolve, reject) {
console.log(tries + ' remaining');
if (--maximumTries > 0) {
setTimeout(function() {
foo();
}, 500);
}
});
}
function myMainFunction() {
var delay = 100;
var maximumTries = 3;
tryAsync().catch(rejectDelay.bind(null, delay, maximumTries));
}
関連回答:(http://stackoverflow.com/questions/38213668/promise-retry-design-patterns/38214203#38214203)プロミスがデザインパターンを再試行]および[約束のステップを再試行]( http://stackoverflow.com/questions/37993365/retry-a-promise-step/37995874#37995874) – jfriend00