Итак, у меня есть отложенная функция с именем delayed1, которая повторяется каждый раз, когда cond1 имеет значение true, проблема в том, что где-то внутри этой функции delayed1 вызывается do_something1 (), и если cond3 имеет значение true, вызывается другая отложенная функция с именем delayed2. Теперь проблема в том, что я хочу, чтобы delayed1 дождался окончания delayed2 (это означает, что cond2 имеет значение false), а затем возобновил, что, похоже, не происходит. Как только delayed2 запускается, delayed1 не ждет его завершения, а затем возобновляет работу. Есть ли способ сделать это? Надеюсь, я был достаточно ясен ...
function delayed2() {
setTimeout(function () {
do_something2();
if ( cond2 ) {
delayed2();
}
}, 1000)
}
function do_something1(){
if ( cond3 ){
delayed2();
}
else {
something_else();
}
}
function delayed1() {
does_something_here();
setTimeout(function () {
do_something1();
if ( cond1 ){
delayed1();
}
}, 1000)
}
3 ответа
Вы можете попробовать использовать обратные вызовы. Ниже приведено основное представление:
var count = 0;
function delay1(callback) {
setTimeout(function() {
console.log("Delay 1");
count++;
if (count < 12) {
if (count % 2 == 0) {
delay1();
} else {
delay2()
}
}
if (callback) {
callback();
}
}, 1000);
}
function delay2(callback) {
setTimeout(function() {
console.log("Delay 2");
if (count > 10) {
delay1(function() {
console.log("This is callback;")
})
} else if (count % 2 == 0) {
delay2();
} else {
delay1()
}
if (callback) {
callback();
}
count++;
}, 1000);
}
delay1();
Вы должны использовать обещания для реализации синхронного выполнения в JS.
Promise - это механизм, который возвращает объект, к которому вы можете подключить обратные вызовы. Эти обратные вызовы могут быть вызваны после выполнения определенной функции с выполнением. Вот как это относится к вашей ситуации.
У вас обычно есть 3 функции, которые зависят друг от друга. Первый должен ждать второго, а второй должен ждать третьего. На первом уровне вторая функция должна возвращать Promise
.
function delayed1() {
does_something_here();
setTimeout(function () {
var promise = do_something1();
promise.then(function(){
if ( cond1 ){
delayed1();
}
});
}, 1000)
}
Вот ваша вторая функция. Это создает обещание и возвращает его. Также внутри if ( cond3 )
он должен ждать обещание от третьей функции. Я не собираюсь писать вашу третью функцию, так как уверен, что вы можете сделать это самостоятельно, следуя этой схеме.
function do_something1(){
return new Promise(function(resolve){
if ( cond3 ){
var promise = delayed(2);
promise.then(function(){
resolve()
})
}
else {
something_else();
resolve();
}
})
}
Я вижу, что вы пытаетесь сделать здесь. Возможно, вы захотите подойти по-другому. Лучший способ - использовать обещания или Отложенные.
Вот пример использования jquery deferreds вашего данного кода.
var wait_a_second = $.Deffered();
$.when(wait_a_second)
.then(does_something_here)
.then(function(){
if( cond1 ) delayed1();
})
.then(delayed1);
function delayed1(){
var d = $.Deffered()
// Your conditions and logic
if( cond ) {
d.resolve();
}
return d.promise();
}
function delayed2(){
var d = $.Deffered();
// Your conditions and logic
if( cond ) {
d.resolve();
}
return d.promise();
}
Вкратце учимся обещать управлять асинхронными операциями в очереди.
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.