如何在Express.js+TypeScript中将循环内Promise结果赋值给外部变量?
问题分析与解决方案
原代码的核心问题是:forEach循环中调用异步函数describeSObject时,不会等待Promise完成就直接执行后续的return response.status(200).json(sObjectsDetails),此时sObjectsDetails还是空数组——因为then里的push操作是异步触发的,还没来得及执行。
修正后的代码
export const getSObjectFields = async (request: Request, response: Response) => { if (!request.body) { return response.status(401).json({ error: 'No SObject Selected' }); } const selectedSObject = request.body; // 用map收集所有Promise,替代forEach const promiseList = selectedSObject.map((element: string) => describeSObject(request, response, element) .catch(err => { console.error(`Error describing ${element}: `, err); // 可选:如果希望单个失败不影响整体,这里可以返回null或错误对象,后续过滤 return null; }) ); // 等待所有Promise完成 const sObjectsDetails = await Promise.all(promiseList); // 可选:过滤掉失败的结果(如果上面catch返回了null) const validResults = sObjectsDetails.filter(result => result !== null); return response.status(200).json(validResults); };
关键修正点
- 用
map替代forEach:map会返回包含所有Promise的数组,方便后续用Promise.all统一处理 await Promise.all等待所有异步操作:确保所有describeSObject的结果都返回后,再组装响应- 错误处理优化:在每个Promise的
catch中单独记录错误,可选控制单个失败是否影响整体响应(比如返回null后过滤,或者直接让Promise.all抛出错误)
如果希望严格处理,只要有一个describeSObject失败就返回错误,可以去掉单个Promise的catch,改用外层try/catch:
export const getSObjectFields = async (request: Request, response: Response) => { try { if (!request.body) { return response.status(401).json({ error: 'No SObject Selected' }); } const selectedSObject = request.body; const promiseList = selectedSObject.map((element: string) => describeSObject(request, response, element) ); const sObjectsDetails = await Promise.all(promiseList); return response.status(200).json(sObjectsDetails); } catch (err) { console.error('Error describing SObjects: ', err); return response.status(500).json({ error: 'Failed to fetch SObject details' }); } };
内容的提问来源于stack exchange,提问作者xTchan
相关产品推荐
相关产品推荐

