10回試して条件にあったらおしまいみたいなコードをjsで書くとしたらこんな感じでしょうか.
setImmediate(function loop(times, limit) { console.log(times + "/" + limit) if(Math.random() > 0.7) { console.log("yay!") return } if(times < limit) { setTimeout(loop, 100, times+1, limit) } }, 0, 10)
シンプルで分かりやすいかなあと思います.
追記
Promise返ってきたほうがお洒落だなと思ってやってみたけど複雑になった気がする.
Promise.resolve({current: 0, times: 10}).then(function loop(o) { return new Promise(function(resolve, reject) { var v = Math.random(); if(v <= 0.7 && o.current < o.times) { setTimeout(function() { o.current += 1 console.log(o); reject(o); }, 50); } else { resolve(v) } }) .then(function(v) { return v }, loop); }).then(function(v) { console.log("done!!!!", v) })
追記2
id:EBAGmasa が書きなおしてくれた,普通に変に難しく考えてたっぽい!
'use strict'; function loop(obj) { return new Promise((resolve, reject) => { if (obj.current > obj.times) { reject(new Error('Error!')); } let v = Math.random(); let retval; if (v <= 0.7) { obj.current += 1; console.log(obj) setTimeout(function() { resolve(loop(obj)); }, 1000) } else { resolve(obj); } }); } loop({ current: 0, times: 10 }) .then(function(v) { console.log("done!!!!", v) }) .catch((e) => console.error(e.stack || e));
もうちょい綺麗にならないかなー,とのことです.参戦お待ちしております