JS重试函数多次查看它是否返回true

时间:2016-03-31 09:45:57

标签: javascript

如果函数返回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
}

我只是在寻找一种更好,更清晰的方式来编写上面的代码。

3 个答案:

答案 0 :(得分:5)

var retries = 5;
var success = false;

while (retries-- > 0 && !(success = foo())) {}

console.log(success);

此处,retries--在每次循环迭代时倒计时,success = foo()执行foo()并将结果保存到success

如果retries点击0success变为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>
))}