在呼叫结束之前执行功能的最佳方法是什么?
JavaScript函数示例:
var notifyState = function(state) {
setTimeout(function () {
/*Do something*/
}, 2000);
};
然后我调用两次函数:
notifyState('State1');
notifyState('State2');
此函数在paraller中执行。顺序执行它们的最佳方法是什么?我只能修改notifyState
功能。 notifyState
只能使用一个参数执行。
更新
函数notifyState
通知Flash游戏中的实际状态。它将它保存在html代码中,当状态改变时状态为覆盖。在selenium测试我从html代码下载状态,但状态变化太快,selenium没注意到这个,所以我尝试睡眠JavaScript。
答案 0 :(得分:6)
这取决于您是否希望 #notifyState 使用setTimeout。如果您不需要 setTimeout ,那么您只需按如下方式重写:
var notifyState = function(state) {
/* Do something */
}
notifyState('State 1');
notifyState('State 2');
如果你想保留 setTimeout 并对调用进行链接,那么在第一次通知之后执行第二次通知,则必须提供回调:
var notifyState = function(state, callback) {
setTimeout(function() {
/* Do something */
if (callback) {
callback();
}
}, 2000);
}
notifyState('State 1', function() {
notifyState('State 2');
});
修改强>
似乎OP问题不同。我的理解是你提供 #notifyState 函数作为你不能控制的第三方Flash的回调,你想确保对notifyState的调用以相同的顺序和一个接一个地执行,因此,您没有同时运行 notifyState 的2个并行调用。为此,您需要引入一个队列来保持状态并更改 notifyState 函数,以便当时只执行一个状态。我将假设你需要 setTimeout 在这里很重要,并保持这种方式。请参阅以下代码:
var Queue = [],
running = false;
var notifyState = function(state) {
if (running) {
Queue.push(state);
} else {
running = true;
setTimeout(function() {
/* Do something */
running = false;
var nextState = Queue.pop();
if (nextState) {
notifyState(nextState);
}
}, 2000);
}
}
答案 1 :(得分:2)
添加一个可选参数,作为回调函数。检查参数实际上是否为函数,如果是,则运行它。
var notifyState = function(state,fn) {
setTimeout(function () {
/*DoSomething*/
if(typeof(fn)=='function'){ fn(); }
}, 2000);
};
然后您可以调用这样的函数:
notifyState('State1', function(){
notifyState('State2');
});
答案 2 :(得分:0)
var notifyState = function(state, callback) {
setTimeout(function () {
/*Do something*/
callback();
}, 2000);
};
通话功能:
var state1CompleteHandler = function() {
// code to execute when state 1 logic completes
notifyState('State2');
}
notifyState('State1', state1CompleteHandler);