我是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))
}
解决了这个问题,现在你可以谈论房间里的大象了
- 你有一个
async
功能,没有await
- 你正在使用承诺构造函数反模式-即
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
-这在您的原始代码中也是如此,只是想我要提到