Angenommen, ich baue einen typischen RSS-Reader. Ich bin mehrere Feeds Parsen und schreiben alle ihre Folgen zu DB:Wie man Ablehnungen in Bluebird behandelt, ohne eine Promise-Kette zu brechen?
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))
- Wir alle bekommen die Feeds
- Für jeden Feed emittieren
processFeed()
- Für jede Folge emittieren
processEpisode()
vonprocessFeed()
Wenn jedoch fetchMetadata(episode)
für eine Episode für einige Feeds eine Ablehnung wirft, alle die Kette ist gebrochen und fällt sofort in globale .catch(err=> console.log(err))
.
In normalen Situation müssen wir etwas mit unbearbeiteten Episode tun, aber die am wenigsten sollte normal verarbeitet werden. Eine Lösung besteht darin, processEpisode()
in ein äußeres Versprechen zu verpacken und an Ort und Stelle zu handhaben.
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)
})
})
Aber ich nehme an, es ist ein offensichtliches Anti-Muster. Und wenn es nach processEpisode()
ein anderes Element in der Promise-Kette höherer Ebene gibt, wird es fehlschlagen, weil processEpisode
true
anstelle des realen Ergebnisses auflösen wird.
Gibt es eine elegante Möglichkeit, solche Probleme zu lösen? Ich habe durch finally
Anweisung in Bluebird gesucht, aber ich bin mir nicht sicher, es ist der beste Weg.
Vielen Dank!
Versucht dies kurz vor Ihrem Kommentar, und es hat funktioniert :) Vielen Dank für die Bestätigung. Markieren Sie dies als gelöst. – f1nn