嵌套循环中Promise方法saveForm调用顺序异常,如何实现按序请求服务端
问题根源
Array.prototype.forEach不会等待异步回调执行完成,传入async回调时会一次性触发所有异步任务,因此saveForm请求会并发发起,无法保证顺序- 你内层处理表单字段的逻辑全是同步操作,不需要加async标识,多余的async标识反而会干扰逻辑执行顺序判断
- 原有Promise链存在嵌套回调问题,不利于异步顺序控制
改造方案
将循环替换为支持await等待的for...of结构,按顺序等待前一个saveForm请求完成后再发起下一个,同时拉平Promise链减少嵌套:
const s_db = new storeDb(); // 用async自执行函数包裹支持顶层await (async () => { try { // 拉平异步请求,避免嵌套 const basicForms = await s_db.getBasicFormDataFromDb(); const providerIds = await s_db.getProviderIdsFromDb(); // 外层用for...of循环,保证顺序执行 for (const item of basicForms) { const arr_field = []; const _form_fields = item['fields']; // 内层逻辑全是同步操作,直接用普通循环即可,不需要async for (const fieldItem of _form_fields) { const jsondata = JSON.parse(fieldItem); if (jsondata.hasOwnProperty('SelectiveSetting')) { const replacePId = jsondata.SelectiveSetting.DataProvider.ProviderId; const matched = _.find(providerIds, k => k.oldId === replacePId); if (matched) { jsondata.SelectiveSetting.DataProvider.ProviderId = matched.newId; arr_field.push(JSON.stringify(jsondata)); continue; } } arr_field.push(fieldItem); } item['fields'] = arr_field; // 等待当前saveForm完成后再进入下一轮循环 await new forms().saveForm(item, null); } } catch (err) { // 统一捕获所有异步错误 console.error('执行出错:', err); } })();
补充说明
如果不需要严格顺序执行,只是要保证所有请求完成后再执行后续逻辑,可以用Promise.all批量处理,性能更高;如果必须严格按数组顺序发起请求,上述的for...of+await方案即可满足要求。
内容的提问来源于stack exchange,提问作者zahra banaeian
相关产品推荐
相关产品推荐

