当我在 Promise 中调用一个函数时,它在 ExpressJS 中无法同步工作



我是Node的新手,我在这里要做的是在页面渲染之前调用一个函数,但我的函数在页面渲染后工作,我无法从另一个函数获得数据。

exports.getCity = (req, res) => {
controlCity(req.params.city).then((control) => {
res.render('index.ejs', control);
})
}

const controlCity = async (cityStub) => {
return new Promise((resolve, reject) => {
City.findAll({ where: { SEHIRSTUB: cityStub } })
.then(
city => {
if (city.length === 0) {  // when it comes here it works
resolve({ value: "test" }); 
}
else {
resolve(controlPredictedWeather(city[0])); 
}
}).catch(err => console.log(err));
}
)
}
const controlPredictedWeather = city => {
Predicted_Weather.findAll({ where: { CITYID: city.ID } }).then(
degree => {
if (degree.length === 0) {
return (getPredictedWeather(city)); // it goes another function
}
else {
console.log({ value: degree[0], city: city });
return { value: degree[0].degree, city: city };
}
}
).catch(err => console.log(err))
}

我该如何解决这个问题?

问题是您在controlPredictedWeather函数中不返回任何内容

const controlPredictedWeather = city => {
//  vvv added return here
return Predicted_Weather.findAll({ where: { CITYID: city.ID } }).then(
degree => {
if (degree.length === 0) {
return (getPredictedWeather(city)); // it goes another function
}
else {
console.log({ value: degree[0], city: city });
return { value: degree[0].degree, city: city };
}
}
).catch(err => console.log(err))
}

解决了这个问题,现在你可以谈论房间里的大象了

  1. 你有一个async功能,没有await
  2. 你正在使用承诺构造函数反模式-即new Promise,它从来不需要

既然你已经使用了async关键字,这表明你想使用更容易阅读的async/await模式来使用Promises

那么,为什么不充分利用它呢

这样的

exports.getCity = async (req, res) => {
const control = await controlCity(req.params.city);
res.render('index.ejs', control);
};
const controlCity = async (cityStub) => {
try {
const city = await City.findAll({ where: { SEHIRSTUB: cityStub } });
if (city.length === 0) {  // when it comes here it works
return { value: "test" }; 
} 
// no need for else since returning above
return controlPredictedWeather(city[0]);
} catch(err) {
console.log(err);
}
};
const controlPredictedWeather = async (city) => {
try {
const degree = await Predicted_Weather.findAll({ where: { CITYID: city.ID } });
if (degree.length === 0) {
return (getPredictedWeather(city)); // it goes another function
}
// no need for else since returning above
console.log({ value: degree[0], city: city });
return { value: degree[0].degree, city: city };
} catch(err) {
console.log(err)
}
};

当然,房间里还有一头大象,那就是

中的control
res.render('index.ejs', control);
如果.findAll

中的任何一个抛出错误,将是undefined-这在您的原始代码中也是如此,只是想我要提到

相关内容

最新更新