2015-10-23 3 views
1
function test() { 
    /*some business logic*/ 

    return response; 
} 

function calculate() { 

    if (test() == true) { 
    console.log("Success"); 
    } else { 
    console.log("Fail"); 
    } 
} 

ma fonction de test est dans un fichier différent js qui fait un peu de traitement des affaires (traitement prend un certain temps) sur des données et de retour réponse boolean.Comment faire synchrone réponse de fonction avec les autres déclarations contenues dans l'autre fonction

J'appelle la fonction de test de la fonction de calcul (dans un fichier js différent). Je m'attends à ce que la sortie console soit 'success' (la fonction de test retourne toujours vrai), mais elle me donne 'Fail'. Mais si je débogue ce code et attends parfois '(if(test()==true))' alors j'obtiens une sortie attendue. Fondamentalement, c'est un problème de synchronisation. Comment puis-je résoudre cela?

+0

JavaScript est asynchrone. Sans savoir ce que 'test()' fait réellement, les gens ne peuvent pas vous aider à le comprendre. 'test()' est le bit qui a besoin du travail. Si c'est en faisant une demande de réseau, vous devriez vraiment regarder dans les promesses ou les rappels à la place. JavaScript est un thread unique si vous le hackez pour faire une requête ajax synchrone, vous verrouillez le navigateur pendant qu'il attend la réponse. – ste2425

+1

Non, javascript est ** synchrone ** et simple thread. C'est seulement asynchrone en faisant des requêtes asynchrones. –

+0

Son vrai Daniel .. javascript est langage synchrone .. En fait, le problème était avec la logique métier écrite dans la méthode de test .. Il a maintenant résolu. Merci –

Répondre

0

Je pense que d'après les codes ci-dessus, vous n'auriez aucun problème pour obtenir une exécution "Success". Cela dépend vraiment de la façon dont fonctionne votre logique métier. Si elles s'exécutent de manière asynchrone, vous devez probablement utiliser un modèle piloté par événement pour exécuter votre logique de calcul. Par exemple, vous enregistrez un événement via document.addEventListener('testCompleted', caculate()), puis vous déclenchez cet événement au test().

Espérons que ça aide.

1

J'essaie de modifier un peu votre code pour répondre à vos besoins en utilisant l'objet JQuery Deferred. Si vous commentez "deferred.reject()", vous devriez obtenir le cas lorsque votre fonction est considérée comme ayant échoué.

Cela rendrait votre fonction en attente d'une autre fonction pour donner une réponse.

var test = function(){ 
    var deferred = $.Deferred(); 
    setTimeout(function(){ 
     deferred.resolve(); //deferred.reject(); 
    },3000); 
    return deferred.promise(); 
}; 


test().done(function(){ 
    console.log("success");}) 
     .fail(function(){ 
    console.log("fail");}) 
+0

la fonction setTimeout est juste pour moi de faire cette fonction comme la fonction normale passer du temps pour gérer l'opération – SerMintt