gpt4 book ai didi

javascript - 如何在不破坏 Promise 链的情况下处理 Bluebird 中的拒绝?

转载 作者:行者123 更新时间:2023-11-30 11:58:55 24 4
gpt4 key购买 nike

假设我正在构建一个典型的 RSS 阅读器。我正在解析多个提要并将它们的所有剧集写入数据库:

const processEpisode = (episode)=>
fetchMetadata(episode)
.then(parseMetadata)
.then(writeToDb)

const processFeed = (feed)=>
fetchEpisodes(feed) // returns [Episode]
.map(processEpisode, { concurrency: 3 })

// main
getFeeds() // returns [Feed]
.map(processFeed, { concurrency: 3 })
.catch(err=> console.log(err))
  1. 我们得到所有的提要
  2. 为每个提要发出 processFeed()
  3. 对于每一集从 processFeed()
  4. 发出 processEpisode()

但是,如果 fetchMetadata(episode) 对于某些 feed 的某些情节抛出拒绝,所有 链被破坏并立即落入全局 .catch( err=> console.log(err)).

正常情况下我们需要对未处理的episode做一些处理,但至少应该正常处理。一种解决方案是将 processEpisode() 包装在外部 Promise 中并就地处理。

const processEpisode = (episode)=>
new Promise((resolve, reject)=> {
fetchMetadata(episode)
.then(parseMetadata)
.then(writeToDb)
.then((result)=> resolve(result))
.catch((err)=> {
// something bad happened
// process and error, but resolve a fullfilled Promise!
resolve(true)
})
})

但是,我想这是一个明显的反模式。如果在 processEpisode() 之后在更高级别的 Promise 链中有另一个元素,它将失败,因为 processEpisode 将解析 true 而不是真实结果.

有没有一种优雅的方式来解决这样的问题?我正在浏览 finally Bluebird 中的语句,但我不确定这是最好的方法。

谢谢!

最佳答案

只需将 .catch() 处理程序直接放在 processFeed() 上,这样您就可以在本地处理拒绝并将其转换为已解决的 promise ,这将允许其他所有内容继续:

// main
getFeeds() // returns [Feed]
.map(function(item, index, length) {
return processFeed(item, index, length).catch(function(reason) {
// do whatever you want to here, this will "handle" the rejection
// and turn it into a resolved promise
// whatever you return here will become the resolved value
});
}, { concurrency: 3 })
.catch(err=> console.log(err))

注意:您不需要额外的包装 promise 。添加一个 .catch() 处理程序并从 .catch() 处理程序返回一个正常值会将被拒绝的 promise 变成已解决的 promise ,因为拒绝被认为是“已处理”在此刻。无论您从 .catch() 处理程序返回什么值,都会成为父 promise 的解析值。

.catch() 处理程序只有在返回被拒绝的 promise 或抛出异常时才会保持被拒绝的 promise 。

关于javascript - 如何在不破坏 Promise 链的情况下处理 Bluebird 中的拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37162612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com