【问题标题】:How to queue several functions set by setTimeout with JS/jQuery如何使用 JS/jQuery 对 setTimeout 设置的多个函数进行排队
【发布时间】:2012-10-02 02:43:17
【问题描述】:

我有一个关于 JS 的工作流,它应该通过 setTimeout 函数一个一个地运行几个集合。如何使用 JS/jQuery 来完成,最好以一些简单而美观的方式?

看起来像这样

function recursiveOne(arg1){
  if (allRight) return;

  doSomething();
  andAnotherOne();
  setTimeout(function(){recursiveOne(arg1)}, 3000);
}

function coreFunction(){
  recursiveOne(arg1);
  recursiveTwo(arg2);
  recursiveThree(arg3);
}

只有当 recursiveOne 已经完成最后一次迭代时才应该开始 recursiveTwo。

不好的部分是所有功能都通过 setTimeout 工作,因为我需要等待来自后端的反应,并且无法直接接收它 - 只能通过 HTML 源。

可能的解决方案,我可以看到:

  • 下一个函数回调在前一个函数中正确传递。不太酷。
  • jQuery defered 对象,它也不是那么漂亮,但更好一点。缺点是我仍然应该在我想以这种方式使用的每个函数中增加额外的延迟请求。

【问题讨论】:

    标签: javascript jquery task-queue


    【解决方案1】:

    您需要将函数作为回调发送

    function recursiveOne(arg1, callback){
      if (allRight) callback();
    
      doSomething();
      andAnotherOne();
      setTimeout(function(){recursiveOne(arg1, callback)}, 3000);
    }
    
    
    function coreFunction(){
        recursiveOne(arg1, function(){
            recursiveTwo(arg2)
        });
    
    }
    

    (旁注)我记得这个项目在做异步工作时帮助了我很多:

    https://github.com/caolan/async

    【讨论】:

    • 一件小事,setTimeout(function(){recursiveOne(arg1, callback)}, 3000);然后。我在解决方案中提到了这一点,但在我看来它并不漂亮 :( 是的,在 10-20 个后续函数中它可能会变得更加丑陋。
    • 谢谢。感觉你可以使用 setInterval 更性感一点。
    【解决方案2】:

    您必须使用回调或直接调用coreFunction。您可以在下面找到一种使用函数数组的方法。

    function recursiveOne(arg1){
       if(arg1 < 5){
          arg1++;
          setTimeout(function(){recursiveOne(arg1);}, 500);
       }else{
          console.log("func1 complete");
          coreFunction();
       }
    }
    
    function recursiveTwo(arg1){
       if(arg1 < 10){
          arg1++;
          setTimeout(function(){recursiveTwo(arg1);}, 500);
       }else{
          console.log("func2 complete");
          coreFunction();
       }
    }
    
    function recursiveThree(arg1){
        if(arg1 < 20){
          arg1++;
          setTimeout(function(){recursiveThree(arg1);}, 500);
       }else{
          console.log("func3 complete");
          coreFunction();
       }
    } 
    
    var funcSet = [recursiveOne, recursiveTwo, recursiveThree];
    var funcArgs = [[1], [5], [10]];
    
    function coreFunction(){
       if(funcSet.length){
           var func = funcSet.shift();
           func.apply(window, funcArgs.shift())
       }
    }
    coreFunction();
    

    【讨论】:

    • 哇!好主意,我会尽快尝试。谢谢!
    • 这是一个安静的丑陋解决方案,因为所有递归函数都依赖于名称 coreFunction。我真的建议改用回调。
    • 我同意 :)。使用回调是完美的解决方案。只是想展示如何在没有回调的情况下完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多