簡體   English   中英

等到功能完成

[英]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');
});

的jsfiddle

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM