在Javascript中,延迟函数是否按顺序执行?
我的代码可能会在短时间内连续延迟两个或多个函数。我能保证每个延迟函数都会按照我创建它们的顺序执行吗?对于iOS 5和iOS 6上的web应用程序,代码的正确性取决于按顺序执行的延迟函数 我正在使用,它使用0.01秒的超时来实现 “延迟”功能不会立即运行;相反,它将以同样的方式运行 一旦解释器的调用堆栈为空 从我自己的测试来看,它们似乎是按照我创建它们的顺序执行的。下面的代码按顺序打印了0到99之间的所有整数 测试代码在Javascript中,延迟函数是否按顺序执行?,javascript,ios,prototypejs,Javascript,Ios,Prototypejs,我的代码可能会在短时间内连续延迟两个或多个函数。我能保证每个延迟函数都会按照我创建它们的顺序执行吗?对于iOS 5和iOS 6上的web应用程序,代码的正确性取决于按顺序执行的延迟函数 我正在使用,它使用0.01秒的超时来实现 “延迟”功能不会立即运行;相反,它将以同样的方式运行 一旦解释器的调用堆栈为空 从我自己的测试来看,它们似乎是按照我创建它们的顺序执行的。下面的代码按顺序打印了0到99之间的所有整数 测试代码 for (var i = 0; i < 100; i++) {
for (var i = 0; i < 100; i++) {
(function(x) {
return function() {
console.info(x);
}
})(i).defer();
}
然而,这一结果并不是决定性的。我不知道它在更深层次的函数或不同的CPU负载下是如何工作的。Prototype.js使用setTimeout()
作为其支持代码
function delay(timeout) {
var __method = this, args = slice.call(arguments, 1);
timeout = timeout * 1000;
return window.setTimeout(function() {
return __method.apply(__method, args);
}, timeout);
}
//This calls Prototype's delay() function above (which calls setTimeout)
function defer() {
var args = update([0.01], arguments);
return this.delay.apply(this, args);
}
for setTimeout表示订单是有保证的。然而,许多人声称他们的功能是无序完成的,因此不同的浏览器可能都没有正确地实现规范。我想订单是不能保证的
相反,您应该链接您的功能。所以,做一些类似的事情:
var funcsToRun = [];
var currFunc = 0;
//Add the functions
for ( var i = 0; i < 100; i++ )
{
funcsToRun.push( function(x) {
return function() {
console.info(x);
}
);
}
//This will chain the execution;
function chain()
{
//RUn current function
funcsToRun[ currFunc ]( currFunc++ );
//Now do next one if needed
if ( currFunc < funcsToRun.length ) chain();
}
setTimeout( chain, 10 );
var funcsToRun=[];
var currFunc=0;
//添加函数
对于(变量i=0;i<100;i++)
{
funcsToRun.push(函数(x){
返回函数(){
控制台信息(x);
}
);
}
//这将连锁执行;
功能链()
{
//运行电流功能
funcsToRun[currFunc](currFunc++);
//如果需要,现在做下一个
if(currFunc
为什么不像没有保证一样编程呢?在delay()
方法中,它调用delay()
方法,该方法使用本机setTimeout()
。为什么不使用自定义事件侦听器呢?即document.observe('trigger:myfirstevent',function(){});
然后document.fire('trigger:myfirstevent'));
只要您推迟第一次调用,其余调用将按顺序启动。(自定义事件需要使用“:”进行名称空间设置)@akonsu我发现iOS的JS事件处理在不同于主线程的线程中运行。在多线程环境中,任何函数都可能中途被切断,其他一些代码也会被执行。对于那些习惯于JS传统单线程引擎的人来说,交错代码会导致状态机问题。为了缓解这些问题,我建议问题是,我想推迟一些事件处理回调以模拟单线程代码排序。我认为这里的问题有您的答案:
var funcsToRun = [];
var currFunc = 0;
//Add the functions
for ( var i = 0; i < 100; i++ )
{
funcsToRun.push( function(x) {
return function() {
console.info(x);
}
);
}
//This will chain the execution;
function chain()
{
//RUn current function
funcsToRun[ currFunc ]( currFunc++ );
//Now do next one if needed
if ( currFunc < funcsToRun.length ) chain();
}
setTimeout( chain, 10 );