2014-05-02 3 views
0

Je suis nouveau dans node.js, et si j'ai bien compris, tout rappel est en train de créer un nouvel événement, qui peut être exécuté en parallèle.node.js/Synchroniser les rappels dans node.js

par exemple, j'ai le code suivant avec rappel:

function testFunction(var1){ 
    s3.heah(var1, function(data, err){ 
     return err; 
    }) 
} 

puis je l'appelle à cette fonction:

function callToOtherFunc(var1){ 
    var result = testFunction(var1); 
    if (result != null){ 
     console.log("This is an error!"); 
    } 
} 

Comme je vois, result est toujours null, parce s3.head prendre un certain temps à retourner, et le callToOtherFunc continue avec l'exécution.

Comment puis-je l'éviter?

+0

Le code source de s3.heah serait utile. –

Répondre

0

Si vous ne pouvez pas modifier le code trop, vous devez exécuter un rappel dans le rappel de la méthode s3.heah comme ceci:

function testFunction(var1, callback){ 
    s3.heah(var1, function(data, err){ 
     callback(err); 
    }); 
} 

function callToOtherFunc(var1){ 
    testFunction(var1, function(err) { 
     if (result != null){ 
      console.log("This is an error!"); 
     } 
    } 
} 
0

tout d'abord votre testFunction retour non défini, dans ce résultat de situation être indéfini (result == null) à tout moment.

Reformulez la réponse précédente, vous devez transmettre la valeur result au rappel.

function testFunction(var1, callback){ 
    s3.heah(var1, function(data, err){ 
     callback(err, data); 
    }); 
} 

function callToOtherFunc(var1){ 
    testFunction(var1, function(err, result) { 
     if (result != null){ 
      console.log("This is an error!"); 
     } 
    } 
} 

Pour éviter cet enfer async utilisation async

Vous devez changer la valeur de retour des fonctions pour travailler avec async:

function testFunction(var1, callback){ 
    var1 += 1; 
    callback(null, var1); 
} 

function callToOtherFunc(err, result){ 
    if (result != null){ 
     console.log("This is an error!"); 
    } 
} 

var workflow = async.compose(testFunction, s3.heah), 
    var1 = 10; 
workflow(var1, callToOtherFunc); 

Il va fonctionne bien si vous pouvez changer la source de s3. heah pour travailler avec le rappel function(err, data) au lieu de function(data, err), si ce n'est pas possible - ne pas inclure s3.heah dans le flux de travail.

Questions connexes