J'utilise des variables globales pour passer autour d'une réponse d'un appel AJAX:AJAX: Attente d'une réponse?
window.response = null; // most recent response from XMLHttpRequest
// the callback function for XMLHttpRequest
function userObjFromJSON() {
if (this.readyState == 4) {
var json = eval('(' + this.responseText + ')');
window.response = json;
}
else {
indicateLoading();
}
}
// loads the info for this username on the page
function loadUsernameInfo(username) {
clearPage();
getUserInfo(username);
var profile = window.response; // most recent json response (what if it hasn't come in yet?)
window.response = null;
if (profile) {
indicateLoaded(username);
fillInProfileInfo(profile);
getTweets(username);
var tweets = window.response; // most recent json response (what if it hasn't come in yet?)
if (tweets) {
fillInTweets(tweets, MAX_TWEETS);
var mentions = mentionedUsers(tweets, MAX_TWEETS);
fillInMentioned(mentions);
}
else {
indicateUnavailableTweets();
}
}
else {
indicateInvalidUsername(username);
}
}
Le problème est que, au moment où la fonction de contrôleur veut commencer à remplir l'information, l'appel AJAX n'a pas toujours retourné encore. (Si je le passe lentement dans un débogueur, ça fonctionne bien.) Que puis-je faire pour contourner cela?
J'ai essayé quelque chose comme ceci:
getUserInfo(username);
while (window.response == null); // infinite loop here
var profile = window.response; // most recent json response
Mais ce juste fait mon navigateur ne répond pas.
J'hésite à appeler la fonction nécessaire à partir du rappel, parce que j'essaie d'implémenter model-view-controller. L'appel d'une fonction contrôleur/affichage à partir du modèle donne l'impression de rompre le motif.
J'essaie de faire model-view-controller, et mettre l'appel de fonction là-bas violerait cela. –