Ich habe zur Zeit eine AJAX to PHP-Gruppe von Funktionen eingerichtet, die eine Reihe von Elementen auf einer Seite verarbeitet. Im Wesentlichen fügt der Code eine Reihe von Aufgaben in die Datenbank ein und fügt anschließend in die Datenbank basierend auf diesen neu erstellten Aufgaben-IDs Ressourcen ein. Es funktioniert jedoch 90% der Zeit. Manchmal scheint es, als ob die Aufgaben-IDs nicht zuerst erstellt werden, was es den Verbrauchsmaterialien nicht erlaubt, diese IDs zum Einfügen in die Datenbank zu verwenden. Gibt es eine Möglichkeit, um sicherzustellen, dass die Aufgabe eingefügt wird, dann werden alle Verbrauchsmaterialien für diese ID eingefügt und dann auf die nächste übertragen. Am Ende, wenn alles fertig ist, möchte ich auf eine neue Seite umleiten, wieder habe ich dies beim letzten Erfolgsaufruf auf den Zubehörteil gesetzt, aber es würde auf der ersten Schleife umgeleitet. Dieser Prozess generiert normalerweise ungefähr 5 Aufgaben mit 12 Vorräten pro Aufgabe. Ich habe über eine $.when
-Schleife gelesen, konnte sie aber nicht zum Laufen bringen. HINWEIS: Nach dem Testen der Ajax-Aufrufe, die korrekt gesendet werden, war es so, dass ein Feld bei einigen von ihnen null war und die DB ein Problem hatte. So funktioniert die folgende Counter-Methode.So warten Sie, bis AJAX-Aufrufe in einer einzelnen Schleife abgeschlossen sind, bevor Sie ohne ASYNC fortfahren: FALSE
$(document).on("click", "#submitTasks", function(e) {
e.preventDefault();
var tasks = $('#tasks').find('.box');
var project_id = $('#project_id').val();
tasks.each(function() {
var trs = $(this).find('.reqTables').find('.table').find('tbody').find('tr');
var task_definition_id = $(this).find('.task_definition_id').val();
var labor_type_id = $(this).find('.laborAmount').children('option:selected').val();
var task_status_id = 1;
var qty_labor = $(this).find('.laborQty').val();
var amount_labor = $(this).find('.laborTotal').val();
var amount_materials = $(this).find('.matTotal').val();
var amount_gst = $(this).find('.gstTotal').val();
amount_materials = +amount_materials + +amount_gst;
amount_materials = amount_materials.toFixed(2);
var active = 1;
//console.log(div)
var task = {
project_id : project_id,
task_definition_id : task_definition_id,
labor_type_id : labor_type_id,
task_status_id : task_status_id,
qty_labor : qty_labor,
amount_labor : amount_labor,
amount_materials : amount_materials,
active : active
};
saveTasks(task, trs, project_id);
});
});
function saveTasks(task, trs, project_id) {
$.ajax({
type : "POST",
url : "<?php echo base_url(); ?>" + "mgmt/project/saveTasks",
data : task,
dataType : "json",
cache : "false",
success : function(data) {
trs.each(function() {
var total = $(this).find('input[name="calculatedCost"]').val();
if (total != 'n/a') {
var task_id = data;
var supply_id = $(this).find('.suppliesPicker').children('option:selected').val();
var task_requirement_id = $(this).find('td:first-child').data('id');
var qty = $(this).find('input[name="calculatedQty"]').val();
var cost_per = $(this).find('.costPicker').val();
var delivery_cost = $(this).find('input[name="transport"]').val();
var notes = '';
var qty_actual = '';
var active = 1;
var taskSupply = {
task_id : task_id,
supply_id : supply_id,
task_requirement_id : task_requirement_id,
qty : qty,
cost_per : cost_per,
delivery_cost : delivery_cost,
total : total,
notes : notes,
qty_actual : qty_actual,
active : active
};
saveTaskSupplies(taskSupply);
console.log(taskSupply);
}
});
}
});
}
function saveTaskSupplies(taskSupply) {
$.ajax({
type : "POST",
url : "<?php echo base_url(); ?>" + "mgmt/project/saveTaskSupplies",
data : taskSupply,
dataType : "json",
cache : "false",
success : function(data) {
***** I WANT TO REDIRECT TO A NEW PAGE WHEN THE LAST ONE OF THESE COMPLETES ******
}
});
}
Mögliche Duplikat [Warten Sie, bis alle Anfragen jQuery Ajax getan werden?] (Http://stackoverflow.com/questions/3709597/wait-until-all-jquery-ajax-requests-are-done) – Seth
Ich habe versucht, diese Arbeit zu machen, jedoch nicht alle Anfragen zur gleichen Zeit passiert. Es gibt eine Funktion in der ersten Schleife, die eine zweite Funktion 12 Mal aufruft, dann durchläuft die erste Schleife ein zweites Mal und ruft diese zweite Funktion 10 Mal auf. Dieses '.when' sieht aus, was ich brauche, aber wo würde ich es einfügen.Ich habe versucht, die when-Schleife auf 'saveTasks (task, trs, project_id)' und auf 'saveTaskSupplies (taskSupply);' aber das scheint nicht zu funktionieren – user1881482
Grundsätzlich müssen Sie Zähler hinzufügen, um zu verfolgen, wie viele Elemente, die Sie verarbeitet haben, und sobald der verarbeitete Wert == Gesamtanzahl ist, fahren Sie fort. Ich arbeite eine vollständige Antwort. – cyberbit