Javascript: 在另一个延迟函数中调用一个延迟函数

Javascript: Calling a delayed function inside another delayed function

所以,我有一个称为 delayed1 的延迟函数,每次 cond1 为真时都会重复,问题是,在 delayed1 函数 do_something1() 的某个地方被调用,如果 cond3 为真,另一个延迟函数称为delayed2 被调用。 现在的问题是我希望 delayed1 等到 delayed2 完成(这意味着直到 cond2 为假)然后再次恢复,这似乎没有发生。一旦 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)

}

您可以尝试使用回调。以下是基本表示:

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();

我明白你想在这里做什么。您可能希望以不同的方式进行处理。最好的方法是使用 promises or Deferreds.

这是使用给定代码的 jquery 延迟的示例。

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();
}

简而言之,学习管理异步操作队列的承诺。

你应该使用promises在JS中实现同步执行

Promise 是一种机制,它 return 是一个您可以挂钩回调的对象。一旦特定函数执行完毕,就可以调用这些回调。以下是它如何适用于您的情况。

你通常有 3 个相互依赖的函数。第一个应该等第二个,第二个应该等第三个。在第一级中,第二个函数应该 return a Promise.

function delayed1() {

    does_something_here();

    setTimeout(function () {
        var promise = do_something1();

        promise.then(function(){
            if ( cond1 ){
               delayed1();
           }
        });

    }, 1000) 
}

这是您的第二个函数。它创建了一个承诺并 return 实现了它。同样在其 if ( cond3 ) 内部,它应该等待第三个函数的承诺。我不会编写您的第三个函数,因为我确定您可以按照此模式自己完成。

function do_something1(){

   return new Promise(function(resolve){
       if ( cond3 ){
           var promise = delayed(2);

           promise.then(function(){ 
              resolve()
            }) 

       }
       else {
          something_else();
          resolve();
       }    
   })  


}