J'ai un processus où un utilisateur met dans une liste délimitée par des virgules qui est ensuite traitée un élément à la fois. Je veux être capable d'indiquer à l'utilisateur qu'il est en train de le traiter et de lui faire savoir quand c'est fait. J'ai donc utilisé l'idée du rideau de la relecture de Borgar à ... Div Over Page. Cela a fonctionné mais le rideau disparaît bien avant que le processus ne soit terminé. Je crois que c'est parce que chaque appel de la boucle forEach à l'intérieur de la fonction importIDs est appelé de manière asynchrone, retournant ainsi le contrôle avant qu'il ne se termine. (Je sais que c'est l'idée derrière le code asynchrone.) Alors, que dois-je faire pour garder le rideau jusqu'à ce que ce soit fait?Le rideau javascript (utilisé pour identifier le processus occupé) ne s'affiche pas pour tout le processus. Proball Je ne comprends pas le rappel suffira
HTML qui appelle la fonction
<label>Import list:</label><input style="width: 30em;" type="text" id="jcDelimitedList"/><input onclick="importIDs('jcDelimitedList','selectedJobCodes','AddJobCode');" type="button" value="Do It"/>
fonction d'importation
importIDs = function(dList,nodeId,actionName){
busyProcess(function(){
var ids = dojo.byId(dList).value;
dojo.forEach(ids.split(","),function(entry,i){doAssosiate(nodeId,actionName,null,dojo.byId(entry));});
});
};
qui appelle la fonction occupée
busyProcess = function(callback){
var ret;
var curtain = document.body.appendChild(document.createElement('div'));
curtain.id = "curtain";
curtain.onkeypress = curtain.onclick = function(){return false;};
try{
ret = callback();
}finally{
curtain.parentNode.removeChild(curtain);
}
return ret;
};
qui à son tour traite le passé en boucle qui appelle doAssosiate pour chaque élément dans le tableau:
doAssosiate = function(nodeID,actionName,evt,aNode){
if(aNode==null)return;
var node = dojo.byId(nodeID);
var newNode;
var target = evt!=null?evt.target:aNode;
newNode = dojo.clone(target);
var tID = target.id;
var sUrl = "action/groups." + actionName + "?id=" + tID + "&groupID=" + groupID + bustCache("&");
var get = getDefered(sUrl);
get.addCallback(function(data){
node.appendChild(newNode);
target.parentNode.removeChild(target);
return data;
});
get.addCallback(function(data){
dojo.behavior.apply();
return data;
});
};
qui fonctionne chaque URL avec getDefered
getDefered = function(url){
console.log(url);
return dojo.xhrGet({
url:url
});
};
Je pense avoir tout le code pertinent ci-dessus. Je pensais que l'utilisation de l'envoi de la boucle à travers le processus occupé resterait jusqu'à la fin, puis reviendrait à la place jusqu'à ce qu'elle se déclenche à chaque itération et retourne ensuite avant qu'ils ne soient terminés.
Comme toujours merci pour toute contribution et critique.