如果条件满足,如何在for循环中循环promise并中断

时间:2017-07-28 06:41:15

标签: javascript typescript promise protractor

我是新手,使用Promise并打破了我的头脑来解决这个问题。我想运行一个脚本,直到在量角器中遇到一个条件,下面的代码但它不起作用。如何解决这个问题?

let counter = 30;
for (let i = 0; i < counter; i++) {

  browser.executeScript(somescript).then((value) => {
    //console.log(value);
    if (value > 0) 
      //do some stuff
    }
    else {
      return; //exit for loop --not working
       //or
      i=counter;// to exit if i and counter value same
    }
  })

}

2 个答案:

答案 0 :(得分:1)

我有这个limitedRetry代码似乎是你需要的代码

limitedRetry = (cont, fn) => fn().catch(err => cont > 0 ? limitedRetry(cont - 1, fn) : Promise.reject(err));

您的使用将是

limitedRetry(30, function() {
    browser.executeScript(somescript).then((value) => {
        if (value > 0) {
            // do some stuff
            return 'this will be the resolved value of the promise';
        } else {
            return Promise.reject('try again');
        }
    });
})
.then(v => console.log(v))
.catch(err => console.log(err));

答案 1 :(得分:0)

现在您同时触发所有executeScript,在最坏的情况下,最后一个脚本(结果)可能会先返回。只有拥有之前executeScript的结果时,才应开始下一个executeScript

这可以通过“倾听”来完成。到前一个承诺的结果,并在知道之前的结果之后调用executeScript。我已使用变量somescript替换i,因此结果更具确定性。如果您只是在寻找重试,请参阅另一个答案。

var browser = {
    executeScript: function(i) {
        return Promise.resolve(i);
    }
}

var initial = Promise.resolve(null);
for (var i = 0; i < 30; i++) {
    (function(locali) { 
        initial = initial.then(function(prev) {
            if(prev === undefined) return;

            return browser.executeScript(locali).then(function (value) {
                console.log(value);

                if (value < 5) {
                    return value;
                } else {
                    return;
                }
            });
        });
    })(i);
}