使用async创建Promise时出现逻辑执行异常的求助
问题排查与修复
核心问题
你遇到的问题根源有两个:
resolve()不会终止函数执行:调用resolve()只是标记Promise进入已完成状态,但后续代码仍会继续运行,所以即使在!fixedValue.a时调用了resolve(),后面的fixedValues.push(fixedValue)还是会执行。- Promise构造器回调用
async冗余且易混淆:async函数本身会返回Promise,但Promise构造器的回调不需要返回值,这种写法不仅多余,还容易让你误以为resolve()会中断函数流程。
修复方案
方案1:在resolve()后添加return终止函数
在调用resolve()后立即return,阻止后续代码执行:
let promises = []; let fixedValues = []; let shouldIQuit = false; let value = { b: 1 }; promises.push( new Promise(async (resolve, reject) => { const shouldquit = await shouldIQuit(shouldIQuitValue); if (shouldquit === true) { const fixedValue = await Values.fixThisValue(value); if (!fixedValue.a) { resolve(); return; // 终止函数,避免执行后续push } fixedValues.push(fixedValue); } resolve(); }) ); await Promise.all(promises);
方案2:去掉冗余的new Promise,直接用async函数生成Promise
async函数本身就会返回Promise,不需要额外用new Promise包裹,逻辑更清晰:
let promises = []; let fixedValues = []; let shouldIQuit = false; let value = { b: 1 }; // 定义处理逻辑的async函数 const processSingleValue = async () => { const shouldquit = await shouldIQuit(shouldIQuitValue); if (shouldquit) { const fixedValue = await Values.fixThisValue(value); // 仅当fixedValue存在a属性时,才存入数组 if (fixedValue.a) { fixedValues.push(fixedValue); } } }; promises.push(processSingleValue()); await Promise.all(promises);
说明
方案2更推荐,因为它避免了Promise构造器的冗余写法,逻辑更直观:只有当fixedValue存在a属性时,才会将其加入fixedValues数组,async函数执行完成后会自动resolve,无需手动调用。
内容的提问来源于stack exchange,提问作者williambutcherthe99th
相关产品推荐
相关产品推荐

