あなたがtoo much recursion
回避したい場合 - でも、そのような小さなランダム範囲で発生することができます、あなたはしかし、この
var retry = function retry(fn) {
return fn().catch(function() {
return retry(fn);
});
};
var winner = 5;
var ticket = 0;
var roll = function roll() {
ticket = Math.round(Math.random() * 10);
};
var play = function play() {
roll();
return new Promise(function (resolve, reject) {
if (ticket === winner) {
resolve();
} else {
console.log("Sorry Try Again");
reject();
}
});
};
retry(play).then(function() {
console.log('winner');
});
を行うことができます!これは、同様too much recursion
を引き起こす可能性があること - 最も簡単な修正は、この
var winner = 5;
var ticket = 0;
var roll = function() {
ticket = Math.round(Math.random() * 10);
}
var play = function() {
roll();
return new Promise(function(resolve, reject) {
if (ticket === winner) {
resolve();
} else {
console.log("Sorry Try Again");
// setTimeout to avoid recursion
setTimeout(function() {
resolve(play());
}, 0);
// OR use Promise.resolve().then to asynchify the call to play so as to also avoid recusrion
Promise.resolve().then(function() {
resolve(play());
});
}
});
}
play().then(function() {
console.log("Winner Winner!")
});
だけではなく、あなたresolve(play())
、もう一度遊びを呼び出すです。
コードに示すように、単純に(どちらか一方ではなく、両方を使用:p)をsetTimeoutをまたはPromise.resolve().then(function() { ... });
でresolve(play())
をラップ、再帰の問題を克服するためにあなたが `.thenを持っていない
'play()'への内部呼び出しのコールバック() 'コールバック。 – Barmar