【问题标题】:Is it possible that with two instantly finished code, the second line finished before the first line finished?有没有可能有两个立即完成的代码,第二行在第一行完成之前完成?
【发布时间】:2016-12-06 02:23:22
【问题描述】:

假设我有两行代码,code1 和 code2,它们都运行得非常快:

$(function(){
    var flag=0
    var fistElement=$("#someHTML");
    var secondElement=$("#someOtherHTML");

    fisrtElement.append(secondElement);  //code1
    flag=1                               //code2
})

由于我假设两行代码(code1 和 code2)都可以立即完成,是否有可能标志 update(code2) 在 html update(code2) 之前完成?虽然通常我用几个例子测试它时,code1总是在code2之前完成。

【问题讨论】:

  • 不,上面的代码是程序性的
  • javascript 将等待 code1 完成,然后再执行 code 2
  • 这段代码不会异步执行
  • @madalinivascu 不是 "only ajax"。 JavaScript 中有几个可用的异步操作
  • .append() 函数是同步的 - 见stackoverflow.com/questions/6068955/…

标签: javascript jquery html


【解决方案1】:

JS 是过程代码,意味着它是逐行执行的(除了少数情况下,代码是异步执行的)。

这意味着您的代码将始终以相同的顺序执行 => code1 将始终在 //code2 之前执行

【讨论】:

  • 我当然知道code1会在code2之前START,但我怀疑的一点是code1是否FNIH在code2之前
  • @badbye 说executed我的意思是从开始完成
  • @badbye:你可能想多了。在您的淡出/隐藏示例中,code1 行 (fadeOut) 在 code2 行 (hide) 开始之前运行完成。但是,我们需要清楚这意味着什么。 fadeOut 函数调用 运行并立即返回。然而,它也启动了一个定时调用独立函数的定时器。其他功能管理衰落。但是,它不是此代码的一部分。 fadeOut 函数本身只是设置该计时器并返回,允许下一行代码运行。
  • 区分清楚了吗?函数调用本身(如您的 fadeOut 调用)和它可能异步触发的其他代码之间存在分离。淡出需要三秒钟的事实并不意味着淡出调用 本身 已暂停执行。 fadeOut 本身做的工作很少,几乎立即返回。这个函数调用的完成是允许下一行代码运行的原因。一条语句总是在下一条语句开始之前运行完成。
  • code1 中的函数是否是我们认为的“异步”函数没有任何区别。不是函数本身是异步的,它不是。唯一的异步部分是不同函数中的other代码,稍后可能会调用该代码以响应计时器或其他事件。
【解决方案2】:

试试这个:

function foo(callback) {
    //flag=1   //code2
    console.log( "Code 2 executed" )
    callback();
}
foo(function() {
        //fisrtElement.append(secondElement); //code1
    console.log( "Code 1 executed" )  
});

这行得通,测试一下IN JSFIDDLE

这是您的解决方案。您的代码应如下所示

$(function(){
    var flag=0
    var fistElement=$("#someHTML");
    var secondElement=$("#someOtherHTML");
    foo(1,function() {
        fisrtElement.append(secondElement); //code1
        //console.log( "Code 1 executed" )  
    });

   function foo(f, callback) {
       flag=f   //code2
       //console.log( "Code 2 executed" )
       callback();
   }
})

希望对您有所帮助。谢谢

【讨论】:

  • 对不起,我可能错了,但是为什么将代码移动到函数中会使其异步?而且您的代码没有多大意义:首先您将1 传递为flag,然后将1 分配给标志,执行回调,然后在foo 之后再次执行相同操作。在小提琴中:您首先执行foo 函数,记录"Code 2 executed",然后执行回调。这里没有异步。
  • 对不起,我忘了清理我的代码,感谢您的评论。好吧,只是将代码移动到函数中并不会使其本质上是异步的,尽管我上面的示例并不是说明异步的最佳方式,但回调绝对是实现它的一种方式。
  • 实际上回调不会使其异步。 setTimeout 将。在这里阅读:stackoverflow.com/questions/9516900/…
  • 感谢分享知识,我会记住这一点。但是,如果您可以在以下位置查看更多关于回调的信息,那就太好了:sporto.github.io/blog/2012/12/09/callbacks-listeners-promises OR cwbuecheler.com/web/tutorials/2013/javascript-callbacks OR recurial.com/programming/…
  • 还有更多,你可以用谷歌搜索,没有冒犯,但我不在乎另一个公认的解决方案,说你不能使用回调实现异步特征,无论如何这一切都是关于解决方案,寻求者在此页面中提出了问题,并且给出的解决方案解决了他的问题。就是这样[我关闭]
猜你喜欢
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多