我是新手,使用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
}
})
}
答案 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);
}