【问题标题】:run another function after preceding function has completed?在前一个功能完成后运行另一个功能?
【发布时间】:2010-12-28 14:54:15
【问题描述】:

如果我启动 2 个这样的功能:

prepare_data();
read_data();

然后我猜他们正在同时运行。但是正如你所看到的,功能二取决于第一个,那么我怎样才能在第一个完成后让后者运行呢?

【问题讨论】:

  • 是什么让您认为它们同时运行?
  • 我只是认为他们是......但他们不这样做很好,就像在 php 中一样:)
  • 但是如果你在一个 DOM 元素上有 2 个 jquery 事件处理程序。假设 $(a)​​.click... 哪个会先运行?上面那个还是同时运行?
  • 我相信它们会按照添加的顺序运行。它们不会同时运行。
  • 和往常一样,这里的教训是:尝试一下,然后再想知道会发生什么。

标签: javascript


【解决方案1】:

Javascript 和大多数其他语言按顺序运行代码。

因此,它们不会同时运行。

事实上,不可能同时运行两段不同的 Javascript 代码。但是,在许多其他语言中,可以使用线程。

但是,如果它们进行 AJAX 调用,则两个函数调用的相应服务器端代码将同时运行。
为了防止这种情况,您需要让第一个函数接受一个回调参数并将其传递给第二个函数。

【讨论】:

  • 我会在那里摆脱“和大多数其他语言”。话说得太笼统了……
  • 你不同意吗?是否有任何语言可以并行执行每条语句?
  • @SLaks:不错的稻草人回来了;)我的意思是这句话有点不具体,而且有点误导。你关于线程和回调的东西是我认为你得到的。
  • 使用 window.setTimeout(..) developer.mozilla.org/en/DOM/window.setTimeout 和相关函数可以在同一脚本中同时运行两个或多个不同的 JavaScript 代码。
  • @jdk:不,setTimeout 只是排队执行。 JavaScript 是单线程的(在浏览器中)。根据定义,它不能在同一时刻执行多个语句。
【解决方案2】:

我假设第一个调用会进行某种异步调用,第二个调用依赖于这种异步调用,否则这两个函数将按顺序执行。

如果是这样,您需要在第一个回调中执行第二个。例如,在 jQuery 中:

function prepare_data() {
  $("#data").load("/load_data.php", function() {
    read_data();
  });
}

如果没有更多关于您使用的是 vanilla Javascript 还是特定库的信息,就不可能说出您应该如何解决这个问题。不过,我强烈建议为 AJAX 使用某种库。

【讨论】:

    【解决方案3】:

    可能你想在第一个函数函数成功执行后调用第二个函数,如果是这样,那么你可以这样做

    $('button').click(function()
    {
        function1(someVariable, function() {
           function2(someOtherVariable);
        });
    });
    
    
    function function1(param, callback) {
      alert('Now first function will be called.');
      callback();
    } 
    

    【讨论】:

      【解决方案4】:

      @SLaks

      其实不可能跑两个 不同的 Javascript 代码在 同时。然而,在许多其他 语言,可以使用 线程。

      这完全正确吗?你不能使用网络工作者并行运行 javascript 吗?

      http://www.w3.org/TR/2009/WD-workers-20090423/

      https://developer.mozilla.org/En/Using_web_workers

      【讨论】:

      • 在 IE 中是这样。在 Firefox 中,它不是。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      相关资源
      最近更新 更多