gpt4 book ai didi

Javascript Promises 就像回调一样嵌套得很深

转载 作者:行者123 更新时间:2023-12-01 02:32:05 25 4
gpt4 key购买 nike

我正在尝试将 Promise 与我的异步函数一起使用。根据我的理解, promise 应该可以减轻回调 hell 。然而,我的代码似乎仍然嵌套得很深。

我是否遗漏了有关 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,则 Promise 本身不会解决,而是等待传递的 Promise 解决。这样Promise链就被扁平化了。这同样适用于从 then 链返回 Promise。这非常有用:

function getFriendsList() {
return myRequest.get('/getFriendList').then(resp => {
if (needsAuthentication(resp)) {
return myRequest.post('/auth', credentials).then(() =>
myRequest.get('/getFriendList').then(resp => resp.body)
);
} else {
return resp.body;
}
});
}

function authenticate() {
return getCredentials()
.then(credentials => myRequest.post('/auth'))
.then(resp => {
if(resp.statusCode == '200'){
return resp;
} else {
throw resp;
}
})
}

关于Javascript Promises 就像回调一样嵌套得很深,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48240828/

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