【发布时间】:2023-03-12 10:36:01
【问题描述】:
我对嵌套的 Promise 有一些困难(如下)。
现在我在 catch 中使用async function 来触发authentication Errors。
但这真的是一个好方法吗?难道没有更好的方法吗?
函数必须发送一个 POST 请求。如果authentication Error 被抛出然后login(),否则抛出错误。
如果满足login():重试POST(然后返回结果),否则抛出错误;
function getSomeData() {
return post('mySpecialMethod');
}
function login() {
const params = { /* some params */ }
return post('myLoginMethod', params).then(result => {
/* some processing */
return { success: true };
});
}
const loginError = [1, 101];
function post(method, params, isRetry) {
const options = /* hidden for brevity */;
return request(options)
// login and retry if authentication Error || throw the error
.catch(async ex => {
const err = ex.error.error || ex.error
if (loginError.includes(err.code) && !isRetry) { // prevent infinite loop if it's impossible to login -> don't retry if already retried
await login();
return post(method, params, true)
} else {
throw err;
}
})
// return result if no error
.then(data => {
// data from 'return request(options)' or 'return post(method, params, true)'
return data.result
});
}
使用
getSomeData.then(data => { /* do something with data */});
【问题讨论】:
-
这不起作用:您正在执行“如果没有错误则返回结果”,即使出现错误并且您从重试中得到了一些回报,您然后再次访问
.result。
标签: javascript node.js promise nested