J'ai essayé de mettre cela en termes génériques pour le rendre plus facile à comprendre. S'il vous plaît, comprenez que c'est le concept, pas l'exemple spécifique que j'essaie de surmonter. OK, donc j'ai un peu de JavaScript qui appelle un serveur pour obtenir un objet, disons un ordre. L'ordre a des propriétés comprenant un tableau d'ID d'article de commande. Je veux ensuite faire une boucle à travers lesdits ID et obtenir les enregistrements d'éléments de commande et les retourner dans un tableau, comme ceci:Rappels JQuery/JavaScript, boîte de dialogue modale
function GetOrderItems(orderId){
var orderItemIDs = GetOrderItemIDs(orderId); // array of order item IDs
var orderItems = [];
$.each(orderItemIDs, function(){
var orderItem = GetOrderItem(this); // ignore this function's implementation
orderItems.push(orderItem);
});
return orderItems;
}
La question est qu'il pourrait y avoir un bon nombre de points de commande, mais je dois les obtenir à partir du serveur 1 à la fois (ne demandez pas, cela ne changera pas). Donc, je veux leur faire savoir (à l'aide d'une boîte de dialogue modale de l'interface utilisateur jQuery) combien d'ordres il y a pour qu'ils aient une idée du temps que cela prendra. Alors, je tente d'injecter la ligne indiquée ci-dessous:
function GetOrderItems(orderId){
var orderItemIDs = GetOrderItemIDs(orderId); // array of order item IDs
var orderItems = [];
$("#modalDiv").dialog({title: orderItemIDs.length + " order items to get."});
$.each(orderItemIDs, function(){
var orderItem = GetOrderItem(this); // ignore this function's implementation
orderItems.push(orderItem);
});
return orderItems;
}
Le problème est que montre la fenêtre, mais seulement quand tout est complet. J'ai appris d'une question précédente que vous pouviez utiliser setTimeout pour afficher le modal, mais comment retourner le tableau que je construis?
function GetOrderItems(orderId){
var orderItemIDs = GetOrderItemIDs(orderId); // array of order item IDs
var orderItems = [];
$("#modalDiv").dialog({title: orderItemIDs.length + " order items to get."});
setTimeout(function(){
$.each(orderItemIDs, function(){
var orderItem = GetOrderItem(this); //ignore this function's implementation
orderItems.push(orderItem);
});
return orderItems;
},0);
}
Je l'ai fait aussi une deuxième fonction setTimeout pour montrer les progrès, mais il va droit au dernier et aucune des fonctions courir, comme ceci:
function GetOrderItems(orderId){
var orderItemIDs = GetOrderItemIDs(orderId); // array of order item IDs
var orderItems = [];
$("#modalDiv").dialog({title: orderItemIDs.length + " order items to get."});
setTimeout(function(){
$.each(orderItemIDs, function(){
setTimeout(function(){
var orderItem = GetOrderItem(this); //ignore this function's implementation
orderItems.push(orderItem);
},500);
});
return orderItems;
},0);
}
Merci à l'avance!
Vous nous dites d'ignorer la mise en œuvre de '' GetOrderItemIDs' et GetOrderItem', mais vous les traitez comme des fonctions synchrones tout en déclarant que vous obtenez des données du serveur. Cela semble être la racine des problèmes que vous rencontrez. – nrabinowitz