2015-06-29 47 views
0

我有以下幾點:等待函數執行完成

function functionA() { 
    var myVar = functionB(); 
    functionC(myVar); 
} 

時,functionB需要回答,取決於用戶的輸入。它可能是1秒,但也可能是10秒。所以functionC總是被調用一個未定義的值,因爲functionB()還沒有完成。所以我試過這個:

function functionA() { 
    var def = $.Deferred(); 
    var myVar = functionB(); 
    def.resolve(); 
    $.when(def).done(function() { 
     functionC(myVar); 
    }); 
} 

這也不行。我在StackOverflow上看到了這個:javascript function wait until another function to finish 但是它怎麼能轉移到我的問題? 回顧一下,functionA的執行需要停止,直到functionB()已經回答。謝謝。

+1

您是否考慮過使用functionC()作爲functionB()的回調函數() –

+0

@ReyamOki _「回顧一下,functionA的執行需要停止,直到functionB()已經回答。」_「functionA」似乎不會返回任何價值?可以描述「需要停止」嗎? ,創建stacksnippets,jsfiddle http://jsfiddle.net來演示? – guest271314

回答

0

您可以更改functionB返回延期對象,然後你就可以在異步處理程序內解決,這樣的事情:

function functionA() { 
    var deferred = functionB(); 
    $.when(deferred).done(functionC); 
} 

function functionB() { 
    var deferred = $.Deferred(); 

    // do something async here... 
    // asyncCallback() { 
    //  deferred.resolveWith(this, dataRetrieved); 
    // } 

    return deferred; 
} 

function functionC(data) { 
    console.log(data); 
} 
+0

函數B應該返回用戶輸入,而不是var延遲 – ReyamOki

+0

爲什麼?邏輯是一樣的,只是現在所有依賴於B的回調的代碼都在C函數中執行,而不是分散在兩個函數中。 C的'data'參數將保持相同的值。 –

+0

我不明白在函數B中返回延遲的目的。 (延期)永遠不會開火。我也不明白爲什麼functionC需要一個數據參數,但是你可以在沒有參數的情況下在functionA中調用它。 FunctionB應該返回用戶輸入,以便在函數A中使用它。我只是不知道,如何暫停funtionB的執行,直到輸入完成。像deferred.resolve();返回userInput;或者只是返回userInput();不起作用,因爲返回的值是未定義的。 – ReyamOki

-1

您可以通過functionC作爲參數傳遞給你的functionB作爲提here

function functionA() { 
    var myVar = functionB(callback); 
    functionC(myVar); 
} 

function functionB(callback) { 
    // does something ... 
    if(callback && typeof(callback) === "function") { 
     callback(); 
    } 
} 
0

把你的例子一個簡單的對象,你可以做到以下幾點:

var myObject = { 
    myProp: null, 
    functionA: function() { 
     this.functionB(); 
     var self = this; 
     var i = setInterval(function() { 
      if (self.myProp) { 
       clearInterval(i); 
       self.functionC(); 
      } 
     }, 100); 
    }, 
    functionB: function() { 
     // ... 
     this.myProp = 'user input'; 
    }, 
    functionC: function() { 
     // ... 
    } 
}; 
myObject.functionA(); 

該腳本將檢查每0.1秒,如果myProp設置。如果是,則清除間隔並調用functionC

這種情況下不需要jQuery。