Promise.all中条件Promise失效,原Promise仍执行的问题求解
问题根源
你遇到的问题本质是函数提前执行:调用promiseUtility时,你直接传入了getUsers(req, type, id)的执行结果——也就是一个已经开始运行的Promise。不管condition是true还是false,getUsers在传入参数的那一刻就已经被调用了,自然会触发对应的逻辑。
解决方法
核心思路是延迟Promise的创建:把生成Promise的逻辑包装成一个函数,只有当条件满足时才执行这个函数,生成并返回Promise。
1. 修改promiseUtility函数
export const promiseUtility = (promiseFn, condition) => { if (condition) { return promiseFn(); // 条件为true时才执行函数,生成Promise } else { return Promise.resolve([]); // 直接返回resolve的空数组,匹配后续解构的默认值 } };
这里把原来的promise参数换成promiseFn(一个返回Promise的函数),同时把空Promise改成直接resolve空数组,和你后续解构时的users = []逻辑对齐,避免出现undefined。
2. 调整调用方式
把getUsers这类函数以未执行的函数形式传入,而不是直接调用:
const arr = [ promiseUtility( () => getUsers(req, type, id), // 传入函数,而非执行结果 req.body.shouldGetUsers ), promiseUtility( () => getObjects(req, type, id), req.body.shouldGetObjects ), ]; const [users = [], objects = []] = await Promise.all(arr);
这样只有当shouldGetUsers为true时,getUsers才会被调用,生成对应的Promise;条件为false时,只会返回一个resolve空数组的Promise,不会触发任何不必要的请求。
内容的提问来源于stack exchange,提问作者Chandrika
相关产品推荐
相关产品推荐

