当前位置: 首页 > 面试题库 >

仅在完成多个其他功能后如何执行Javascript功能?

林弘文
2023-03-14
问题内容

我的具体问题是,我需要执行(可能)大量的Javascript函数来准备类似批处理文件的内容(每个函数调用都会向同一批处理文件中添加一些信息),然后在所有这些调用完成之后,执行发送批处理文件的最终功能(例如,将其作为HTML响应发送)。我正在为此寻找一种通用的Javascript编程模式。

概括问题:给定Javascript函数funcA(),funcB()和funcC(),我将找出排序执行的最佳方法,以便仅在执行funcA和funcB之后才执行funcC。我知道我可以使用这样的嵌套回调函数:

funcA = function() {
    //Does funcA stuff
    funcB();
}
funcB = function() {
    //Does funcB stuff
    funcC();
}

funcA();

通过传递回调参数,我什至可以使此模式更通用一些,但是,此解决方案变得非常冗长。

我还熟悉Javascript函数链,其中的解决方案如下所示:

myObj = {}
myObj.answer = ""
myObj.funcA = function() {
    //Do some work on this.answer
    return this;
}
myObj.funcB = function() {
    //Do some more work on this.answer
    return this;
}
myObj.funcC = function() {
    //Use the value of this.answer now that funcA and funcB have made their modifications
    return this;
}
myObj.funcA().funcB().funcC();

虽然此解决方案对我来说似乎更干净一些,但随着您在计算中添加更多步骤,函数执行链会越来越长。

对于我的特定问题,执行funcA,funcB等的顺序无关紧要。因此,在上述解决方案中,从技术上讲,我正在做比所需的更多的工作,因为我将所有功能都以串行顺序放置。对我而言,最重要的是funcC(用于发送结果或触发请求的某些函数)仅在funcA和funcB完成所有执行后才调用。理想情况下,funcC可以某种方式侦听所有中间函数调用以完成,然后将执行?我希望学习一种通用的Javascript模式来解决此类问题。

谢谢你的帮助。

另一个想法:也许将共享库传递给funcA和funcB,当它们完成执行时,将共享库标记为sharedThing.funcA =“
complete”或sharedThing.funcB =“
complete”,然后以某种方式?当共享库达到所有字段都标记为完成的状态时,执行funcC。我不确定您到底可以怎样使funcC等待。

编辑:我应该注意,我正在使用服务器端Javascript(Node.js),并且我想学习一种模式来解决该问题,只需使用普通的旧Javascript(不使用jQuery或其他库)即可。当然,这个问题很普遍,以至于有一个干净的纯Javascript解决方案?


问题答案:

如果要保持简单,可以使用基于计数器的回调系统。这是允许when(A, B).then(C)语法的系统草案。(when/
then实际上只是糖,但整个系统还是有争议的。)

var when = function() {
  var args = arguments;  // the functions to execute first
  return {
    then: function(done) {
      var counter = 0;
      for(var i = 0; i < args.length; i++) {
        // call each function with a function to call on done
        args[i](function() {
          counter++;
          if(counter === args.length) {  // all functions have notified they're done
            done();
          }
        });
      }
    }
  };
};

用法:

when(
  function(done) {
    // do things
    done();
  },
  function(done) {
    // do things
    setTimeout(done, 1000);
  },
  ...
).then(function() {
  // all are done
});


 类似资料:
  • 问题内容: 我有以下JavaScript代码: 我如何确保仅在完成后调用? 问题答案: 指定一个匿名回调,并使function1接受它:

  • 问题内容: 我想在pullData()完成后运行loadViews(),但我想知道这样做的最佳方法是什么?我也想在其上设置10秒超时,以便在可能的情况下显示网络错误。根据我的阅读,GCD看起来是完成此任务的方法,但是我对它的实现感到困惑。谢谢你提供的所有帮助! 问题答案: 您需要的是带有完成块的完成处理程序。 创建它非常简单: 并使用您的完成块,如下所示:

  • 8. 其他功能 8.1. 点名 点击菜单栏,选择点名,设置签到的时长后,可发起签到,查看学员的在线听课情况。 8.2. 布局切换 点击菜单栏,选择布局切换,可切换课堂布局,包括讲课模式、主视频模式、视频平铺模式,具体可参见第四章节。 8.3. 课堂设置 点击菜单栏,选择设置,可设置全体禁言、全体下麦、连麦方式、视频清晰度等。 全体禁言 禁止所有学员参与文字聊天。 全体关麦 关闭所有学员的麦克风,学

  • 问题内容: 页面完全加载后,我需要执行一些JavaScript代码。这包括图像之类的东西。 我知道您可以检查DOM是否准备就绪,但是我不知道这是否与页面完全加载时相同。 问题答案: 叫做。在DOM准备就绪之前就已经出现了问题,实际上是由于等待图像的确切原因而创建了DOM ready 。

  • TestMain 在写测试时,有时需要在测试之前或之后进行额外的设置(setup)或拆卸(teardown);有时,测试还需要控制在主线程上运行的代码。为了支持这些需求,testing 提供了 TestMain 函数: func TestMain(m *testing.M) 如果测试文件中包含该函数,那么生成的测试将调用 TestMain(m),而不是直接运行测试。TestMain 运行在主 g

  • 我安装了android Studio..一切正常。现在突然之间,所有的自动完成功能都不起作用了…我可以在任何地方输入任何东西没有变量检查,没有函数或检查任何东西的帮助。我仍然可以编译这个项目,当它发生时,我会得到错误。 有谁能帮我解决这个问题吗。