2010-03-09 12 views
1

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.

Répondre

0

Quelques bugs intéressants dans ce qui précède. Principalement si la liste des identifiants dans le tableau est trop grande, il traite plus de trafic à la base de données, puis il peut gérer. Donc je suis allé à une fonction récursive à la place de la boucle foreach. Puis enlevé la responsabilité de désactiver le rideau de la fonction busyProcess et l'a ajouté à l'appel récursif qui a désactivé le rideau à la sortie de la récursivité. Pour toute personne qui se soucie ci-dessous sont les fonctions modifiées. Changez aussi pour utiliser dojox.widget.Standby pour le rideau. Au lieu d'appeler doAssosiate maintenant, il appelle assosiateAll;

importIDs = function(dList,nodeId,actionName){ 
    busyProcess(function(){ 
     var ids = dojo.byId(dList).value; 
     var sourceNode = dojo.byId(nodeId); 
     assosiateAll(ids.split(","),0,sourceNode,actionName); 
    }); 
}; 




    assosiateAll = function(idArray,idx,sourceNode,actionName){ 
    if(idx <= idArray.length){ 
     var target = dojo.byId(idArray[idx]); 
     if(target == null){ 
      idx++; 
      assosiateAll(idArray,idx,sourceNode,actionName); 
     }else{ 
      var 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){ 
       sourceNode.appendChild(newNode); 
       target.parentNode.removeChild(target); 
       return data;      
      }); 
      get.addCallback(function(data){ 
       idx++; 
       assosiateAll(idArray,idx,sourceNode,actionName); 
       return data; 
      }); 
      get.addCallback(function(data){ 
       dojo.behavior.apply(); 
       if (idx == (idArray.length -1)) { 
        standby.hide(); 
       } 
       return data; 
      }); 
     } 
    } 
};