【发布时间】:2018-06-22 18:37:11
【问题描述】:
我正在尝试将 Promises 与我的异步函数一起使用。据我了解,承诺应该减轻回调地狱。 但是,我的代码似乎仍然嵌套得很深。
我是否遗漏了一些关于 Promise 的内容(可以将其重写为更具可读性/惯用语)还是有时像回调一样嵌套 Promise?
在此示例中,我正在构建一个函数,该函数调用 API 以从某个社交媒体帐户中检索朋友列表。如果由于身份验证错误导致初始调用失败,我知道我必须先进行身份验证并再次调用。
const myRequest = { /* custom instance of 'request-promise' */ }
function getFriendsList() {
return new Promise((resolve, reject) => {
myRequest.get('/getFriendList').then(resp => {
if (needsAuthentication(resp)) {
myRequest.post('/auth', credentials).then(() => {
myRequest.get('/getFriendList').then(resp => resolve(resp.body))
}).catch(err => {
reject(err)
})
} else {
resolve(resp.body)
}
}).catch(err => {
reject(err)
})
})
}
function authenticate() {
return new Promise((resolve, reject) => {
getCredentials().then(credentials => {
myRequest.post('/auth').then(resp => {
return resp.statusCode == '200' ? resolve(resp) : reject(resp)
})
}).catch(err => reject(err))
})
}
【问题讨论】:
-
是的,你缺少的是承诺被设计成链式的,而不是嵌套的。将现有 Promise 包装在自己的 Promise 中的方式(使用
new Promise((resolve, reject) => {}))是一种反模式。 -
具有嵌套承诺的承诺链有时只能被展平。在其他情况下,嵌套可能很重要。
标签: javascript asynchronous callback promise