如果函数返回true或false,我正在寻找更好的重试方法
function foo() { //
var tabList = window.content.document.getElementById('compTabs') // this might be null if page is not loaded and further code wont work
if (!tabList) { // stop here if tab list is null
return false;
}
// continue and finish function
}
// this is a loop that will go trough an array and this check needs to happen for each element of the array
for (var i; i < loopLenght; i++) {
// This is the actual code nothing else happens here.
if ( !foo() ) {
// try again
if ( !foo() ) {
// try one more time
if ( !foo() ) {
console.log('Failed')
}
}
}
// a lot more code coming here that should only run one per iteration
}
我只是在寻找一种更好,更清晰的方式来编写上面的代码。
答案 0 :(得分:5)
var retries = 5;
var success = false;
while (retries-- > 0 && !(success = foo())) {}
console.log(success);
此处,retries--
在每次循环迭代时倒计时,success = foo()
执行foo()
并将结果保存到success
。
如果retries
点击0
或success
变为true
,则循环停止。不需要循环体。
警告:如果foo()
是异步功能,则无效。
答案 1 :(得分:1)
你在浏览器中吗? (与Node等相反) 是否必须专门重试N次?
while (!condition) { }
但那会阻止你的线程。
如果你想投票......
function whileConditionNotMet()
{
if (!condition) {
setTimeout(whileConditionNotSet, 1000);
return false;
}
// Condition met
// ...
return true;
}
您可以通过递增静态变量来限制它检查的次数:
function whileConditionNotMet()
{
if ( typeof whileConditionNotMet.counter == 'undefined' ) {
whileConditionNotMet.counter = 0;
}
if (whileConditionNotMet.counter++ > 10) {
// Timeout
// ...
return false;
}
if (!condition) {
setTimeout(whileConditionNotSet, 1000);
return false;
}
// Condition met
// ...
return true;
}
...或...
var counter = 0;
while (!condition && counter++ < 10) { }
答案 2 :(得分:0)
看看我写的是什么
handleChange(index, event) {
if (index === 1) {
listOfPaysIndexes.forEach(value => {
values.ending_period_monthly[value] = getValueFromEvent(event);
});
}
// handler for others
}
{listOfPaysIndexes.map(value => (
<Form.Group
widths="equal"
key={`month_${value}`}
>
<Form.Field width={5}>
{/*** HERE IS DATE FIELD ***/}
<DateInput
name={`ending_period_monthly[${value}]`}
value={values.ending_period_monthly[value]}
onChange={handleChange.bind(this, value)}
dateFormat={'MM/DD/YYYY'}
/>
)}
</Form.Field>
</Form.Group>
))}