Javascript:在另一个延迟函数

时间:2015-12-16 06:31:57

标签: javascript jquery function delay

所以,我有一个名为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)

}

3 个答案:

答案 0 :(得分:3)

我看到你在这里想做什么。您可能希望以不同的方式接近。最好的方法是使用promisesDeferreds

以下是使用给定代码的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();
}

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

答案 1 :(得分:2)

您应该使用promises在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 :(得分:1)

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



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();
&#13;
&#13;
&#13;