JavaScript中实现依赖外键的数据库插入顺序函数调用问题
层级顺序插入数据的正确实现方案
原代码问题分析
你之前的写法错误在于在.then()里直接执行了函数(带括号),比如.then(insertSecondLevelData()),这会导致所有插入函数几乎同时启动,完全没有等待前一层级完成,自然达不到顺序执行的效果。
方案一:用async/await顺序执行(推荐,可读性更高)
利用async/await的线性写法,清晰控制层级顺序,同时无依赖的第一层级可以并行执行提升效率:
async function insertData() { // 第一层级:salutation和status无关联,并行插入 await Promise.all([insertSalutations(), insertStatuses()]); // 第二层级:等待第一层级完成后插入doctors(依赖salutation.id) await insertDoctors(); // 第三层级:等待第二层级完成后插入customers(依赖salutation.id、status.id、doctor.id) await insertCustomers(); // 第四层级:等待第三层级完成后插入address(依赖customer.id) await insertAddresses(); }
方案二:正确的Promise链式写法
如果偏好使用.then()链式调用,需要传递函数引用(不带括号)或用箭头函数包裹,确保前一步完成后才执行下一层级:
function insertData() { return Promise.all([insertSalutations(), insertStatuses()]) .then(() => insertDoctors()) .then(() => insertCustomers()) .then(() => insertAddresses()); }
无效数据的处理(跳过无效插入)
在每个插入函数内部添加null判断,跳过外键无效的条目:
示例:处理doctors插入(依赖salutation.id)
async function insertDoctors() { const doctorsList = getDoctorsFromJSON(); // 从原始JSON获取数据 for (const doctor of doctorsList) { // 若salutation_id为null,跳过当前条目 if (!doctor.salutation_id) continue; // 执行数据库插入操作 await db.query( 'INSERT INTO doctors (salutation_id, name, ...) VALUES (?, ?, ...)', [doctor.salutation_id, doctor.name, ...] ); } }
同理,在insertCustomers中需检查salutation.id、status.id、doctor.id是否有效;insertAddresses确保customer.id有效后再执行插入。
内容的提问来源于stack exchange,提问作者CRoNiC
相关产品推荐
相关产品推荐

