【问题标题】:How to chain Promises while keeping the data?如何在保留数据的同时链接 Promises?
【发布时间】: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/awaittrycatch 块一起用于错误处理。
  • @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


【解决方案1】:

你可以nest `.thens´,但在这种情况下,我显然会选择 async / await:

async function retrieveWeather() {
   if (crds) {
      const locData = await mapbox.getLocation(crds);
      const weatherData = await darksky.getWeather(crds);

      return Object.assign(weatherData, {city: locData.city});
   } else if (term) {
     const locData = await mapbox.getCoords(term);
     const weatherData = await darksky.getWeather(locData.crds);

     return weatherData;
   } else {
     throw {error: 'Aborted due to unexpected POST-Body'};
   }
}

(async function sendWeather() {
  try {
    const weatherData = await retrieveWeather();
    io.emit('update', weatherData);
    console.log(`Answer sent: ${JSON.stringify(weatherData)}`);
  } catch(error) {
     io.emit('update', error);
     console.error(reject.error);
  }
})();

【讨论】:

  • @MiXT4PE 异步函数也“只返回一个承诺”。这就是 await 的作用。
猜你喜欢
  • 2011-03-21
  • 2021-11-17
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多