2016-11-07 121 views
0

讓我們想象,我有一些代碼:寫一個函數回調

var someString = ""; 
function do1(){ 
    doA(); 
    doB(); 
} 

function doA(){ 
    // some process that takes time and gets me a value 
    someString = // the value I got in prior line 

function doB(){ 
    //do something with someString; 
} 

什麼是確保somestring由DOB定義嘗試使用它的正確方法?我認爲這是一種需要回調的情況,但我不確定如何設置它?

+2

究竟什麼是「一些過程時間」?它是異步的,即函數在完成之前是否返回? – Ryan

+0

我想我有點困惑。我知道如果代碼是異步的(例如使用ajax的東西),我會需要一個解決方案,但是在任何情況下doB都可以在doA之前執行,因爲doA非常慢(即一些巨大的循環),或者代碼總是一行一行地運行,除非一行是異步的? – COMisHARD

+0

好吧。如果它是異步的,它將不會逐行運行。如果您在doA()內部進行ajax調用,它很可能是異步的(不要將async設置爲false)。如果doA()中有一個巨大的循環,它會將someString設置爲doB()之前仍會運行的內容。但是如果發生大的循環,你可能想看看webworkers,這將允許你做多線程。 – Thomas

回答

1

通常,我已經通過回調參數解決了這個問題,如下面的代碼。但是,我不知道這是否正確答案。在我的情況下,它做得很好。

var someString = ""; 
function do1(){ 
    doA(doB); 
} 

function doA(callback){ 
    // some process that takes time and gets me a value 
    someString = // the value I got in prior line 
    callback(); 
} 

function doB(){ 
    //do something with someString; 
} 
+1

'doA(function(){doB()});'可以簡化爲'doA(doB);' – Ouroborus

+0

哦謝謝! :)我不知道。我要解決它。 – Bakyuns

+0

我相信我可以很容易地接受並使用它。但我不明白。你介意告訴我更多關於這段代碼的邏輯嗎? – COMisHARD

0

我通常寫這些函數可以使用或不使用回調函數來調用。只有在typeof callback === 'function'的情況下,才能通過調用callback函數來執行此操作。這允許包含回調的可能性的功能有點更通用。顯然,對callback()的調用需要來自您正在執行的任何異步操作的回調。在以下示例中,setTimeout用作異步操作。

var someString = ""; 
 
    
 
function do1() { 
 
    doA(doB); //Call doA with doB as a callback. 
 
} 
 
    
 
function doA(callback) { 
 
    setTimeout(function() { 
 
     //setTimeout is an example of some asynchronous process that takes time 
 
     //Change someString to a value which we "received" in this asynchronous call. 
 
     someString = 'Timeout expired'; 
 
     //Do other processing that is normal for doA here. 
 

 
     //Call the callback function, if one was passed to this function 
 
     if (typeof callback === 'function') { 
 
      callback(); 
 
     } 
 
    }, 2000); 
 
} 
 
    
 
function doB() { 
 
    //do something with someString; 
 
    console.log(someString); 
 
} 
 

 
do1();

你可以,當然,做到這一點不使用全局變量:一個使用

function do1() { 
 
    doA(doB); //Call doA with doB as a callback. 
 
} 
 
    
 
function doA(callback) { 
 
    setTimeout(function() { 
 
     //setTimeout is an example of some asynchronous process that takes time 
 
     //Simulate a result 
 
     var result = 'Timeout expired'; 
 

 
     //Do other processing that is normal for doA here. 
 

 
     //Call the callback function, if one was passed to this function 
 
     if (typeof callback === 'function') { 
 
      callback(result); 
 
     } 
 
    }, 2000); 
 
} 
 
    
 
function doB(result) { 
 
    console.log(result); 
 
} 
 

 
do1();

0
function someFunctionA(callback){ 
    var someString = "modify me"; 
    callback(someString); 
} 

function someFunctionB(someString){ 
    // do something 
} 

function main() { 
    someFunctionA(somefunctionB); 
} 
相關問題