【问题标题】:Javascript: Calling a delayed function inside another delayed functionJavascript:在另一个延迟函数中调用延迟函数
【发布时间】:2016-03-22 04:40:21
【问题描述】:

所以,我有一个名为delayed1 的延迟函数,每次cond1 为真时都会重复,问题是,在delayed1 函数do_something1() 内部的某处被调用,如果cond3 为真,另一个名为delayed2 的延迟函数被调用。 现在的问题是我希望delayed1 等到delayed2 完成(这意味着直到cond2 为假)然后再次恢复,这似乎没有发生。一旦延迟 2 开始,延迟 1 不会等待它完成然后恢复。有没有办法做到这一点?希望我足够清楚......

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)

}

【问题讨论】:

  • 你们能详细说明一下吗?不好意思,我昨天刚开始学js
  • “希望我说得够清楚了……” 不完全是,在这里解释。 “对不起,我昨天刚开始学习js”“我的代码比我在示例中写的要复杂得多”?可以创建 stacksn-ps blog.stackoverflow.com/2014/09/… 来演示吗?见stackoverflow.com/help/mcve
  • 我昨天开始学习 js,但我知道编程的基础知识 :) 我不确定 stacksn-ps 是否可以工作,因为我正在通过 Tampermonkey 将这段代码用于某个站点。
  • 您想每秒重复运行 do_something2 和 do_something_here 和 do_something1 吗?
  • Autocucumber 很烦

标签: javascript jquery function delay


【解决方案1】:

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

这是使用 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();
}

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

【讨论】:

    【解决方案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();
           }    
       })  
    
    
    }
    

    【讨论】:

    • 所以如果我理解正确,我必须从第三个函数(在本例中称为 delay2() )返回另一个承诺,这应该可以解决问题,对吧?
    • 这不应该做点什么吗? jsfiddle.net/7esybcu9 我知道我在某处做错了什么,我在网上搜索了 Promise,但只是想不出一种方法让它们在我的特定情况下起作用。对不起
    • 你有两个问题。一是您不运行任何功能。在delayed1 函数后添加()。另一个问题是delayed2 函数不能解决任何问题。所以,promise.then 永远不会在do_something1 内部执行。从头开始阅读 Promise 教程 (MDN)。做简单的样品。然后为两个级别构建您的案例。当您对 2 级架构有很好的了解时,可以进入 3 级。
    【解决方案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();

    【讨论】:

    • 在尝试了 promise 和 Deferreds(不成功)之后,我把它作为最后的手段,它完全按照我的意愿工作,非常感谢 :) 现在如果你不是像我这样的菜鸟,我建议使用其他 2 个解决方案,因为它们更受推荐,我必须自己学习使用它们,但我现在只需要快速解决这个问题。再次感谢您的回答
    • 我很高兴,我能够提供帮助。我也可能是错的,但promises 是由于称为callback hell 的情况而发明的。可以参考callbackhell,SO - Post
    • 当然。 Promise 提供了简单、简短和新颖的机制来执行您在此处所做的回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多