Affichage des réponses AJAX dans le même ordre où elles ont été envoyées sans utiliser de requêtes synchrones

J’envoie plusieurs requêtes getJSON. Après chaque requête, je construis un panneau et initialise une grid hiérarchique tierce avec les données. Le problème que je rencontre est que les panneaux ne sont pas créés dans l’ordre d’envoi des demandes mais dans leur ordre de retour. Je pense que je me suis plongé dans un tout mais je ne veux vraiment pas avoir à retravailler ça si je ne le suis pas.

var _grids = { ServiceGrid: { id: 0, parentUrl: _SERVICE_CONTENT_URL, childUrl: _SERVICE_HISTORY_URL, parentElementName: "ServiceTypeName", childElementName: "ServiceLogEnsortinges", childPrimaryKey: "LogID", tableName: "Service", data: [], parentColumns: [...], childColumns: [...] }, ServiceItemGrid: { id: 1, parentUrl: _SERVICE_ITEM_CONTENT_URL, childUrl: _SERVICE_ITEM_HISTORY_URL, parentElementName: "PackageServiceItemName", childElementName: "ServiceItemLogEnsortinges", childPrimaryKey: "LogID", tableName: "Service Item", data: [], parentColumns: [...], childColumns: [...] } }; function prepareDataForGrid(_grids, id) { var tableIdIncrementor = 0; var $panelGroup = $("
").addClass("panel-group"); // Append Accordion $panelGroup.attr("id", "accordion"); $panelGroup.appendTo("#placeholder"); $.each(_grids, function(index, grid) { var parentUrl = grid.parentUrl, childUrl = grid.childUrl, //Request data parentData = getApiDataAjax(parentUrl, id), childData = getApiDataAjax(childUrl, id); $.when(parentData, childData).done(function (parentDataResult, childDataResult) { //Combine child to parent combineElements(parentDataResult[0], childDataResult[0], grid); // Hydrate grid.data with combined data grid.data = parentDataResult[0]; //loop through grids, build panels for each parent $.each(grid.data.result, function(index, value) { appendhtml(grid, value, tableIdIncrementor); //Create hierarchical grid $("#" + tableIdIncrementor).igHierarchicalGrid({ initialDataBindDepth: 1, dataSource: JSON.ssortingngify(value), dataSourceType: "json", responseDataKey: "result", autoGenerateColumns: false, primaryKey: "ID", columns: grid.parentColumns, autoGenerateLayouts: false, defaultChildrenDataProperty: value[grid.childElementName], columnLayouts: [ { key: grid.childElementName, autoGenerateColumns: false, primaryKey: value.childPrimaryKey, columns: grid.childColumns } ] }); tableIdIncrementor++; }); }); }); }

Je pourrais éventuellement faire tous les panneaux en premier et attacher les grids aux panneaux via les identifiants, mais ce serait tellement plus simple si je pouvais append des panneaux et des grids dans l’ordre dans lequel les demandes étaient envoyées.

Merci.

Une solution simple serait de créer et d’append une div à la div cible pendant que vous bouclerez, puis d’insérer des données dans chaque div lorsque les données arriveront.

 $.each(function () { var $thisDiv = $("
").appendTo("#targetDiv"); $.when(doThis,doThat).done(function (result1, result2) { $thisDiv.append(result1).append(result2); }); });

Cependant, je préférerais construire la structure html à l’avance et l’insérer en même temps, simplement parce que je préfère toucher le moins possible à la dom.