You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:50:33