[英]Wait until function is finished
在呼叫結束之前執行功能的最佳方法是什么?
示例JavaScript函數:
var notifyState = function(state) {
setTimeout(function () {
/*Do something*/
}, 2000);
};
然后我調用兩次函數:
notifyState('State1');
notifyState('State2');
這個函數在paraller中執行。 順序執行它們的最佳方法是什么? 我只能修改notifyState
函數。 notifyState
只能使用一個參數執行。
更新:函數notifyState
通知flash游戲中的實際狀態。 它將它保存在html代碼中,當狀態改變時狀態為覆蓋。 在selenium測試我從html代碼下載狀態,但狀態變化太快,selenium沒注意到這個,所以我嘗試睡眠JavaScript。
這取決於你是否希望#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同時運行。 要實現這一點,您需要引入一個隊列來保持狀態並更改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);
}
}
添加一個可選參數,作為回調函數。 檢查參數實際上是否為函數,如果是,則運行它。
var notifyState = function(state,fn) {
setTimeout(function () {
/*DoSomething*/
if(typeof(fn)=='function'){ fn(); }
}, 2000);
};
然后你可以調用這樣的函數:
notifyState('State1', function(){
notifyState('State2');
});
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.