Итак, у меня есть отложенная функция с именем 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)

}
4
Pred 16 Дек 2015 в 09:31

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();
1
Rajesh 16 Дек 2015 в 06:50

Вы должны использовать обещания для реализации синхронного выполнения в 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();
       }    
   })  


}
2
Charlie 16 Дек 2015 в 18:33

Я вижу, что вы пытаетесь сделать здесь. Возможно, вы захотите подойти по-другому. Лучший способ - использовать обещания или Отложенные.

Вот пример использования 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();
}

Вкратце учимся обещать управлять асинхронными операциями в очереди.

3
Vinay Aggarwal 16 Дек 2015 в 06:51