2016-11-07 2 views
0

Lässt sich vorstellen, dass ich einen Code haben:mit einem Rückruf eine Funktion Schreiben

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; 
} 

Was ist der richtige Weg ist sicher, somestring zu machen, indem DOB definiert ist versucht, es zu benutzen? Ich denke, das ist eine Situation, die einen Rückruf erfordert, aber ich bin mir nicht sicher, wie ich das einrichten soll.

+2

Was genau „etwas Prozess ist, dauert Zeit"? Ist es asynchron, d. H. Kehrt die Funktion zurück, bevor sie abgeschlossen ist? – Ryan

+0

Ich denke, ich bin ein wenig verwirrt. Ich weiß, dass ich eine Lösung in Fällen benötigen würde, in denen der Code asynchron ist (wie etwas, das Ajax verwendet), aber es gibt immer einen Fall, wo DoB vor DoA ausführen könnte, nur weil doA sehr langsam ist (dh eine große Schleife), oder läuft Code immer Zeile für Zeile, wenn eine Zeile nicht asynchron ist? – COMisHARD

+0

Nun ja. Wenn es asynchron ist, wird es nicht Zeile für Zeile ausgeführt. Wenn Sie innerhalb von doA() einen Ajax-Aufruf durchführen, ist es höchstwahrscheinlich asynchron (setzen Sie async nicht auf false). Wenn Sie eine riesige Schleife in doA() haben, die someString auf etwas setzt, wird dies immer noch vor doB() ausgeführt. Aber im Falle von großen Loops möchten Sie vielleicht einen Blick in Webworkers werfen, die es Ihnen ermöglichen, Multi Threading durchzuführen. – Thomas

Antwort

1

Normalerweise habe ich dieses Problem wie folgenden Code nach Rückrufparameter gelöst. Ich weiß jedoch nicht, dass das die richtige Antwort ist. In meinem Fall ist es gut gemacht.

+1

'doA (function() {doB()});' könnte reduziert werden auf 'doA (doB);' – Ouroborus

+0

Oh danke !! :) Ich wusste das nicht. Ich werde es reparieren. – Bakyuns

+0

Ich glaube, ich könnte das leicht nehmen und benutzen. Aber ich verstehe es nicht. Würde es Ihnen etwas ausmachen, mir ein bisschen mehr über die Logik dieses Codes zu erzählen? – COMisHARD

0

Normalerweise schreibe ich diese so, dass die Funktion mit oder ohne Callback Funktion aufgerufen werden kann Sie können dies tun, indem Sie die callback Funktion nur aufrufen, wenn typeof callback === 'function'. Dies ermöglicht, dass die Funktion, die die Möglichkeit eines Rückrufs einschließt, ein etwas allgemeinerer Zweck ist. Der Aufruf an die callback() muss natürlich aus dem Rückruf von asynchroner Operation, die Sie gerade ausführen, stammen. Im folgenden Beispiel wird setTimeout als asynchrone Aktion verwendet.

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();

können Sie, natürlich, dies zu tun, ohne eine globale Variable:

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); 
} 
Verwandte Themen