2016-10-29 28 views
0

解決方法.thenの方法がログアウトしないのはなぜですか?アイデアはすべての失敗をログアウトし、値が一致するとすぐに.thenメソッドにある「Winner Winner」をログアウトすることです。約束は解決しません。

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"); 
 
     play(); 
 
    } 
 
    }); 
 

 
} 
 

 

 
play().then(function() { 
 
    console.log("Winner Winner!") 
 
});

+0

'play()'への内部呼び出しのコールバック() 'コールバック。 – Barmar

答えて

1

あなただけの最初のplay()が成功した勝者ではなく、再帰的なものをログに記録しています。内側の呼び出しに.then()を追加します。

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"); 
 
     play().then(function() { 
 
     console.log("Winner Winner"); 
 
     }); 
 
    } 
 
    }); 
 

 
} 
 

 

 
play().then(function() { 
 
    console.log("Winner Winner!") 
 
});

あなたはそれをしない関数を定義し、両方の場所でそのコードを繰り返したくない場合。

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"); 
 
     playtest(); 
 
    } 
 
    }); 
 

 
} 
 

 
function playtest() { 
 
    play().then(function() { 
 
    console.log("Winner Winner!") 
 
    }); 
 
} 
 

 
playtest();

+0

これはとても奇妙です。再帰的であってもplay関数が同じように動作すると仮定しました。しかし、今私はそれを見ている、より理にかなっている。迅速で簡単な答えをありがとう! – WriterState

+0

@ JaromandaXより良い構造を示す答えを投稿し、その仕組みを説明できますか?私はES6の約束の専門家ではないので、正義をすることはできません。 – Barmar

+0

Nevermind - 私の提案とあなたのソリューションの両方が '再帰回数が多すぎます ' - ランダム* 1000のコードを試してみてください。 –

1

あなたが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を持っていない

+0

' reject'は 'retry'で捕まえられるエラーを投げますか? – nbrooks

+0

正確には、再試行は、拒絶がない限り再生を続けるでしょう。 –

+0

私はおそらく、拒否/キャッチを全く必要としない単純な修正であることを追加しました。 –

関連する問題