在Javascript中退出函数之前强制页面加载

时间:2016-03-29 19:35:06

标签: javascript jquery synchronization

我有一个或多或少形式的脚本

function a() {
  //do stuff
  $(window).onload = function() {
    //do stuff after loading
  }
  //do more stuff
 return true;
 }

我需要保证onload函数在函数 a 返回任何内容之前发生。有没有办法干净地做到这一点?我无法重构代码以包含onload中的所有内容,它需要完全重写所有代码。

3 个答案:

答案 0 :(得分:1)

你可以尝试让ONLOAD运行一切

optind

答案 1 :(得分:0)

使用jQuery。在此处获取:http://jquery.com/

然后这样做:

$(document).ready(function() {
    //Do your stuff here
});

答案 2 :(得分:0)

Javascript是单线程的,因此每次运行一段脚本代码时,它都会运行完成而不会被中断。事件处理程序(例如“加载”事件)不会在运行其他脚本的过程中执行;没有“等待”或“睡眠”命令允许在操作过程中暂停同步代码。所以对你的问题的简短回答是“不”。

ECMA 2015介绍generator functions,在受控情况下,允许在函数内的指定点执行和恢复函数。 虽然他们目前在某些主流浏览器中缺乏支持,但确实提供了其他异步编码技术的替代方案,例如ES6承诺(在重构解决方案时可能很有用)。以下生成器代码例如:

function* a()
{   // do stuff
    window.addEventListener("load",
       function()
       {   // do stuff on load
           console.log("window.loaded");
           aGenerator.next();  // continue a();
       }
    );

    console.log("executing a() before yield");
    yield "'yield before window load'";
    console.log("executing a() after yield");

    // do stuff after load
    console.log("a() before return");
    return true;
}
var aGenerator = a();


function b()
{  console.log("calling a from b");
   var obj = aGenerator.next();
   console.log("b() received value %s", obj.value);
}
b();
  • 使用aGenerator创建一个Generator对象a()以运行aGenerator.next()代码。
  • b致电aGenerator.next()' to run the first half of a`。
  • 传回b的对象的值包含第一个yield表达式的值。
  • 窗口加载事件处理程序通过调用a来运行aGenerator.next的后半部分。它将传回a返回的值。

然而,如果不重构代码,这实际上将同步性问题推向了一个函数调用级别:b不等待并在调用load事件处理程序之前返回。