我有一个或多或少形式的脚本
function a() {
//do stuff
$(window).onload = function() {
//do stuff after loading
}
//do more stuff
return true;
}
我需要保证onload函数在函数 a 返回任何内容之前发生。有没有办法干净地做到这一点?我无法重构代码以包含onload中的所有内容,它需要完全重写所有代码。
答案 0 :(得分:1)
你可以尝试让ONLOAD运行一切
optind
答案 1 :(得分:0)
答案 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事件处理程序之前返回。