【发布时间】:2019-12-31 01:16:50
【问题描述】:
我有两个像这样链接的 API 调用:
let weatherPromise;
if (crds) {
weatherPromise = mapbox.getLocation(crds)
.then(locData => darksky.getWeather(crds))
.then(weatherData => Object.assign(weatherData, {city: locData.city}));
} else if (term) {
weatherPromise = mapbox.getCoords(term)
.then(locData => darksky.getWeather(locData.crds));
} else {
weatherPromise = Promise.reject({error: 'Aborted due to unexpected POST-Body'});
}
weatherPromise.then(weatherData => {
io.emit('update', weatherData);
console.log(`Answer sent: ${JSON.stringify(weatherData)}`);
}, reject => {
io.emit('update', reject);
console.error(reject.error);
});
但它根本不起作用。错误处理无处不在(主要只是记录undefined 和失败),例如locData 在第二个then() 中似乎不再可用。我尝试嵌套 Promises,效果很好,但如果可以的话,我想避免这种反模式。
【问题讨论】:
-
您可以将
async/await与try和catch块一起用于错误处理。 -
@RohitKashyap 为什么我不能使用 Promise?
-
可以,而且嵌套 promise 也不是反模式。这当然是固执己见。
-
看来您在这里要做的是 join 承诺,而不是链接它们;考虑做类似
Promise.all([mapbox.getLocation(crds), darksky.getWeather(crds)]).then([locData, weatherData] => ...) -
在 Promise 构造函数中使用 Promise 是一种反模式,但在某些情况下嵌套使用 Promise 完全没问题且是强制性的。我只是使用
async/await来提高可读性和可维护性。
标签: javascript node.js promise es6-promise