2016-03-22 2 views
-1

Я хочу повторно запустить функцию, если она вернет true и повторит ее после второй, если она вернет false.Запуск функции без старых значений

function longSynchronous() { 
    return condition ? true : false // "condition" is a longlasting synchronous request which either returns true or false 
} 
function schedule() { 
    if (longSynchronous()) { 
    schedule() 
    } else { 
    setTimeout(function() { 
     schedule() 
    }, 1000); 
    } 
} 
schedule() 

Однако, после того, как один раунд, longSynchronous() уже равна истинным или ложным, без необходимости запуска и завершения снова. Таким образом, я заканчиваю бесконечно бегущую функцию schedule(), не останавливаясь на тайм-ауте. Есть ли способ сделать schedule() бежать каждый раз, не будучи true или false

+2

@ itzmukeshy7 - это уже вывешенный. – tymeJV

+2

Можете ли вы поделиться своим видением 'condition'? – gurvinder372

+0

Трудно сказать без примера скрипки, но похоже, что проблема не '' 'longSynchronous()' '', а '' 'condition'''. '' 'longSynchronous()' '' не является переменной, поэтому каждый раз, когда он вызывается, это вызов _new_. «' condition''', с другой стороны, может быть что угодно. Итак ... что находится в '' 'condition'''? – Azuaron

ответ

1

Это звучит, как Вы желаете, чтобы опрашивать то, но ваша программа не дожидаясь результата опроса каждый раз. Если это так, то обратные вызовы помогут вам здесь.

function longSynchronous(callback) { 
    setTimeout(function() { 
    callback(condition); 
    }); 
} 
function schedule() { 
    longSynchronous(function(result) { 
    if(result) { 
     schedule() 
    } else { 
     setTimeout(function() { 
     schedule() 
     }, 1000); 
    } 
    }); 
} 
schedule() 

Here's a Fiddle демонстрируя, что функциональность, но я немного смущен последней части вашего вопроса, чтобы я мог быть с отметкой здесь.

0

У вас возникли проблемы в вашем состоянии, потому что в вашем случае вы вызываете longSynchronous(), который является функцией, и при каждом вызове он возвращает значение в соответствии с вашим условием, а не переменную, которая должна быть задавать.

0

Посмотрите на образец ниже, имеет версию обещание, и версия обратного вызова, даже если вы FUNC является синхронизация, которая должна помочь вам получить вещи сделать

//promise version 
 
function longSynchronous() { 
 
    return new Promise(function(resolve, reject) { 
 
    //true or false 
 
    resolve(Math.random() > .5); 
 
    }); 
 
} 
 

 
function schedule() { 
 
    //consume promise result 
 
    longSynchronous().then(function(value) { 
 
    if (value) { 
 
     //simple logger 
 
     print(0); 
 
     schedule(); 
 
    } else { 
 
     setTimeout(function() { 
 
     print(1000); 
 
     schedule(); 
 
     }, 1000); 
 
    } 
 
    }); 
 
} 
 
schedule(); 
 

 
//node style version 
 
//promise version 
 
function longSynchronous(callback) { 
 
    callback(null, Math.random() > .5); 
 
} 
 

 
function schedule() { 
 
    //call with callback 
 
    longSynchronous(function(err, value) { 
 
    if (value) { 
 
     print(0); 
 
     schedule(); 
 
    } else { 
 
     setTimeout(function() { 
 
     print(1000); 
 
     schedule(); 
 
     }, 1000); 
 
    } 
 
    }); 
 
} 
 
schedule(); 
 

 
function print(num){ 
 
    var ul = document.querySelector('ul'); 
 
    var li = document.createElement('li'); 
 
    li.textContent = num; 
 
    ul.appendChild(li); 
 
    
 
}
<p>Note that 1000 appear as sequence, while 0 appears instantly</p> 
 
<ul></ul>

Смежные вопросы