gpt4 book ai didi

javascript - 如何在没有 ASYNC : FALSE 的情况下继续之前等待每个循环中的 AJAX 调用完成

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:01:17 25 4
gpt4 key购买 nike

我目前已经设置了一个 AJAX 到 PHP 的函数集来处理页面上的多个项目。基本上,代码将一系列任务插入到数据库中,然后根据那些新创建的任务 ID 将供应品插入到数据库中。然而,它在 90% 的时间里都有效。有时似乎没有首先创建任务 ID,这不允许供应使用这些 ID 插入数据库。有没有办法确保插入任务,然后插入该 ID 的所有耗材,然后移动到下一个。最后,当一切都完成时,我想重定向到一个新页面,我再次将其放在用品部分的最后一次成功调用中,但它会在第一个循环中重定向。这个过程通常会产生大约 5 个任务,每个任务有 12 个供应品。我正在阅读有关 $.when 循环的内容,但无法使其正常工作。注意:在测试 ajax 调用正确提交后,其中一些调用的一个字段为空,数据库出现问题。所以下面的计数器方法有效。

$(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 ******
}
});
}

最佳答案

此代码将等待嵌套循环 ajax 函数调用完成它们的 promise ,然后继续..

var allPromises;

$(document).on("click", "#submitTasks", function(e) {
//...
var tasks = $('#tasks').find('.box');

allPromises = [];

tasks.each(function() {
//.. somehow getTask
var req = saveTasks(task, trs, project_id);
allPromises.push(req);
});

$.when.apply(null, allPromises).done(function(){
// Do your things here,
// All save functions have done.
});
});

function saveTasks(task, trs, project_id) {
return $.ajax({
// ,,, your codes
success : function(data) {
// ...
trs.each(function() {
// ... Somehow get taskSupply
var req = saveTaskSupplies(taskSupply);
allPromises.push(req);
}
}
});
}

function saveTaskSupplies(taskSupply) {
return $.ajax({
// ... bla bla bla
success : function(data) {
// Whatever..
}
});
}

关于javascript - 如何在没有 ASYNC : FALSE 的情况下继续之前等待每个循环中的 AJAX 调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com