2014-01-08 99 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);