2014-01-08 66 views
4

在通话结束之前执行功能的最佳方法是什么?等到功能结束

例JavaScript函数:

var notifyState = function(state) { 
setTimeout(function() { 
    /*Do something*/ 
}, 2000); 
}; 

然后我调用函数两次:

notifyState('State1'); 
notifyState('State2'); 

此功能在并联机器人执行。顺序执行它们的最佳方法是什么?我只能修改notifyState函数。 notifyState只能用一个参数执行。

更新: 函数notifyState通知flash游戏中的实际状态。它将它保存在html代码中,当状态改变,然后状态被覆盖。在硒测试中,我从html代码下载状态,但状态变化太快,硒没有注意到这一点,所以我尝试了睡眠JavaScript。

+9

“回调”时间 – Praveen

+0

首先...在javascript中没有多线程,所以你的函数将总是按顺序运行,但你不知道按什么顺序 – SOReader

+0

@PraveenJeganathan:如果OP只能修改'notifyState'函数,回调不起作用 – musefan

回答

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的调用以相同的顺序执行并且一个接一个地执行,所以您不需要有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); 
    } 
} 
+0

我只能用一个参数(实际状态)执行'notifyState'。我不知道接下来会发生什么状况。 – estradowiec

2

添加一个可选参数,该参数将充当回调函数。检查参数实际上是一个函数,如果是,运行它。

var notifyState = function(state,fn) { 
    setTimeout(function() { 
     /*DoSomething*/ 
     if(typeof(fn)=='function'){ fn(); } 
    }, 2000); 
}; 

然后,您可以调用的函数,像这样:

notifyState('State1', function(){ 
    notifyState('State2'); 
}); 

JSFiddle

+1

但是Op提到'只能修改notifyState函数.'所以我觉得OP不能使用它 – Praveen

+0

所以OP可以修改函数本身而不是调用函数? – George

+0

基于这样的问题,只有OP可以澄清它。 – Praveen

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);