ExpressJS中Promise调用函数无法同步执行的问题求助
问题解决方法
你的核心问题是**controlPredictedWeather函数没有返回异步操作的Promise**,导致controlCity里的resolve拿到的是undefined——因为函数内部的findAll是异步执行的,函数本身没把这个异步任务的结果传出去,自然没法在页面渲染前拿到数据。
接下来给你重构后的代码,同时用async/await简化逻辑,避免嵌套的then:
重构后的完整代码
exports.getCity = async (req, res) => { try { // 等待所有数据获取完成再渲染页面 const control = await controlCity(req.params.city); res.render('index.ejs', control); } catch (err) { console.log(err); // 这里可以根据需求返回错误页面或提示 res.status(500).send('获取数据失败'); } } const controlCity = async (cityStub) => { const city = await City.findAll({ where: { SEHIRSTUB: cityStub } }); if (city.length === 0) { return { value: "test" }; } else { // 等待controlPredictedWeather的异步结果 return await controlPredictedWeather(city[0]); } } const controlPredictedWeather = async (city) => { try { const degree = await Predicted_Weather.findAll({ where: { CITYID: city.ID } }); if (degree.length === 0) { // 假设getPredictedWeather是异步函数,同样用await等待结果 return await getPredictedWeather(city); } else { console.log({ value: degree[0], city: city }); return { value: degree[0].degree, city: city }; } } catch (err) { console.log(err); // 抛出错误让上层捕获,避免静默失败 throw err; } }
关键修改点
- 让所有异步函数返回Promise:用
async声明函数,内部用await处理异步操作,这样函数自动返回Promise,上层可以等待它的结果。 - 去掉手动创建Promise的冗余:
controlCity原本手动new Promise,用async/await可以直接简化,代码更易读。 - 错误捕获:在顶层的
getCity里统一捕获错误,避免某个异步环节出错导致页面无响应。 - 确保所有异步操作都被等待:不管是
City.findAll还是controlPredictedWeather,都用await等待完成,保证res.render执行时数据已经准备好。
另外注意:如果getPredictedWeather也是异步函数,必须确保它返回Promise,否则await不会生效——如果它原本没有返回Promise,你需要给它包一层或者修改它的实现。
内容的提问来源于stack exchange,提问作者sametckilic
相关产品推荐
相关产品推荐

