半空洞男女関係

思ったこととかプログラミングしてるときのメモとか色々かいてます。メールはidそのままgmail

レッツプッシュ購読

何回か試してタイムアウト的なコード

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));

もうちょい綺麗にならないかなー,とのことです.参戦お待ちしております