2010-05-12 3 views
0

Je veux m'assurer que je comprends correctement les rappels, et le calendrier javascript en général.Javascript et le calendrier, en particulier avec des rappels

Dites que mon code ressemble à ceci, est-il garanti de s'exécuter dans l'ordre?

SetList(); // initializes the var _list 

Some.Code(_list, function(data) { 

     // update list 

}); 

DoSomething(_list); // operates on _list 

Mise à jour

Ce que je vois est appels setlist, puis DoSomething, puis Some.Code.

Some.Code appelle une autre fonction. si:

Some.Code(_list, function() { 

    //load _list from ajax request 
    Other.Code.WithCallback(_list, function(){....}); 

}); 

Je suppose que pour résoudre ce problème, je dois ajouter DoSomething à la fonction interne comme un autre rappel?

Répondre

1

SetList(), Some.Code() et DoSomething() s'exécuteront dans cet ordre, l'un après l'autre. La fonction anonyme passée comme deuxième argument à Some.Code() peut être appelée pendant l'exécution de Some.Code() (avant que la fonction ne retourne et DoSomething() est appelée) ou elle pourrait être appelée plus tard par une autre fonction, et gestionnaire d'événement ou temporisateur, tout dépend lorsque vous l'avez spécifié pour être appelé.


Puisque vous utilisez ajax, la demande au serveur distant est fait sur un thread séparé, de sorte que le fil exécution javascript continue d'exécuter et d'appeler d'autres fonctions jusqu'à ce qu'une réponse (ou, plus précisément, pour la onreadystatechange événement à tirer). Lorsque l'état prêt de la requête ajax est modifié, son gestionnaire d'événements readystatechange est mis en file d'attente pour être appelé, ce qui signifie qu'il s'exécutera dès que tous les scripts en cours d'exécution seront terminés.

Si vous souhaitez que DoSomething() s'exécute après la réception de la réponse via ajax, vous devez l'exécuter à la fin de votre fonction de rappel.

+0

Comment puis-je m'assurer que la fonction anonyme est exécutée avant l'appel de DoSomething (_list); ? – Blankman

+0

@Blankman: Vous devrez l'appeler à un moment donné pendant la méthode 'Some.Code()', avant que cette méthode ne retourne. –

+0

mis à jour ma question .. – Blankman

-1

que le code est exécuté dans l'ordre:

SetList(), puis Some.Code(), puis la fonction (données), puis DoSomething().

JavaScript est mono-thread et s'exécute dans l'ordre. La seule façon de ne pas synchroniser les événements est de définir un intervalle/temporisateur dans Some.Code() ou function (data) qui a appelé une autre fonction.

Si vous aviez:

var i=0; 
functionCall() //some long process that sets i=1; 
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); } 

Ce alerterait "Pour" Mais si vous aviez:

var i=0; 
setTimeout(functionCall, 1000) //some long process that sets i=1; 
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); } 

Ce exécuterait "Out of Order," parce que le la troisième ligne serait exécutée avant que functionCall() soit appelée.

Mise à jour Réponse

Parce que vous utilisez Ajax, je suppose que vous faites un appel asynchrone, ce qui est la raison du retard.Vous avez une fonction de rappel, mais elle attend toujours d'être rappelée, donc Javascript passe à l'exécution de la ligne suivante pendant qu'elle attend.

Pour exécuter dans l'ordre que vous voulez, vous devez faire ceci:

SetList(); // initilizes the var _list 
Some.Code(_list, function(data) { 
    // update list 
    DoSomething(_list); // operates on _list 
}); 

De cette façon, vous pouvez vous assurer que DoSomething() est appelée lorsque votre méthode de rappel est appelée, et non avant.

+0

fonction (données) ne * pas * être exécuté dans l'ordre que vous avez dit. Il est passé comme un argument à Some.Code, et pourrait être exécuté à tout moment, ou pas du tout, il n'y a pas assez d'informations à dire. – Nathan

+0

Si la fonction (données) est appelée est réellement en dehors du point. Comme vous pouvez le voir dans la structure de la fonction (data), ajouter l'appel à DoSomething (_list) signifie qu'il fait partie de la méthode de rappel - et se déclenche après tout ce qui précède, en assurant l'ordre désiré. – AlishahNovin