2017-05-23 1 views
0

Juste une question «idiote» mais cela me déroute beaucoup, pour un étudiant d'AngularJS. Lorsque console.logging une variable, disons var result est une promesse d'un GET ou autre, et .then() Je fais certaines tâches, comme asignin une variable.Facile à propos de Angular: Pourquoi cela change-t-il l'ordre?

var result = ... ; 

    $scope.number = {}; 


    result.then(function(data) { 
     $scope.number = 5; 

     console.log($scope.number); 
    }); 


console.log($scope.number); 

Okay! Donc, pour moi, cela devrait imprimer

5 
5 

(Dans le cas où j'initialiser une variable de portée de $, en dehors de cette fonction ou promesse)

5 
undefined 

(dans le cas où la deuxième .log tente d'imprimer un non variable globale -defined, en dehors de la fonction)

Alors je reçois:

undefined 
5 

Pourquoi l'outter $scope.number imprime-t-il avant la variable interne (5)?

Je veux initialiser la variable après avoir obtenu le GET, dans la promesse, et plus tard, utiliser la var initialisée.

Merci =) Cela accélérera mon apprentissage!

Répondre

0

La principale chose à comprendre est que les éléments suivants retourne une promesse immédiatement:

var result = ... ; 

Juste après, vous passez une fonction à la méthode .then de la promesse:

result.then(...) 

et droit après que vous faites:

console.log($scope.number); 

Puis plus tard - une fois l'asynch l'action ronous (comme une requête HTTP) complète et la promesse résout - la fonction que vous avez passé à .then exécute enfin:

function(data) { 
    $scope.number = 5; 

    console.log($scope.number); 
} 

Alors promesses existent pour vous aider à gérer le comportement asynchrone. Ils commencent vraiment à briller quand vous devez gérer plusieurs fonctions asynchrones:

asyncFunction1().then(function() { 
    // This executes after asyncFunction1 completes 
    return asyncFunction2(); 
}).then(function() { 
    // This executes after asyncFunction2 completes 
}); 
+0

Super, je comprends mieux maintenant. Je le verrai 'similairement' aux fonctions récursives, que la fonction parente continue d'attendre jusqu'à ce que sa fonction enfant se termine. Donc, si je veux continuer à travailler avec $ scope.number, disons que c'est un nombre qui retourne avec un HTTP.GET, je devrais concaténer avec une autre fonction? Par exemple, comme vous l'avez fait? 'asyncFunction1() puis (fonction (données) {$ scope.number = données; retour asyncFunction2 (scope.number de $);} ).. Puis (function() { console.log (portée de $. numéro); }); ' Encore une fois, c'est un code facile, le 1er initialise nombre, et en second lieu, peut le traiter. – ButterySAM777

+0

Toute autre façon de traiter l'étendue $.variable dans la promesse, de le traiter plus tard consécutivement? Je vous remercie! – ButterySAM777

+0

La façon dont vous le faites semble correcte. Vous définissez $ scope.number à l'intérieur de la fonction que vous avez transmise à '.then', ainsi vous attendez que la réponse http soit terminée. Vous n'avez besoin d'une seconde fonction que si vous renvoyez une autre promesse de la première fonction, comme si vous deviez effectuer une seconde requête http après la première terminée. –