所以在這一點上,承諾似乎比回調更像「最佳實踐」,但許多現有的庫仍然使用回調。在承諾中包裝現有API的回調以避免「回調地獄」有什麼好處?
所以考慮到已經實現了這樣的回調格局庫:
library.connect(function(err) {
library.someQuery({}).exec(function(err, result) {
// some code
library.someQuery(result).exec(function(err2, result2) {
// some code
})
})
})
有益處的諾言包裝這些回調,以避免嵌套?
new Promise((resolve, reject) => {
library.connect(function(err) {
if (err) reject(err)
else resolve()
}
}).then(() => {
return new Promise((resolve, reject) => {
library.someQuery({}).exec((err, result) => {
if (err) reject(err)
else resolve(result)
}
})
}).then((result) => {
return new Promise((resolve, reject) => {
library.someQuery(result).exec(function(err2, result2) {
if (err) reject(err2)
else resolve(result2)
}
}).then((result) => {
// some code
}).catch((err) => // handle error)
沒有嵌套它更好,但它更詳細。另外我不確定這會帶來多少額外的好處。也許更好的錯誤處理?
在你的第一個片段中,你有多個位置來處理錯誤,而有了promise的你只有一個。 – andlrc
@ dev-null是的我認爲這將是一個可能的答案。還有其他好處嗎?或者,也許可以減少冗長? – m0meni
你可以創建helper函數'callbackToPromiseCallbacks(resolve,reject){return(err,res)=> err?拒絕(err):解析(res);}'以減少樣板代碼。 – Ginden