gpt4 book ai didi

javascript - 对于这个 promise 安排,我可以省略这个 catch block 吗?

转载 作者:行者123 更新时间:2023-12-02 22:09:08 25 4
gpt4 key购买 nike

我正在尝试使用最佳实践。根据我的理解,你只需要在 promise 链末尾有一个 catch 子句。

然而,这不是一个直接的链。 createUser() 位于 then 方法中。但是 createUser() 中的任何错误不应该被 getOrCreateUser() 捕获吗?

我可以省略 createUser() 中的 catch 子句吗?

function getOrCreateUser (accessToken, refreshToken, profile, done) {
const user_props = obtainUserPropsFromGoogle(profile);
DBM.getUser(user_props.id_google).then( (res) => {
return res[0] ? done(null, user_props) : createUser(done, user_props);
}).catch( error => {
return done(error, null);
});
}

function createUser (done, user_props) {
DBM.createUser(user_props).then(() => {
return done(null, user_props);
}).catch( error => {
return done(error, null);
});
}

最佳答案

Can I omit the catch clause in createUser()?

不,不是代码编写的方式。

为了从内部 promise 中删除catch外部 promise 需要处理内部 promise 的拒绝。 p>

为此,您需要从 createUser 返回内部 promise 。然后,您需要从外部 Promise 的 then 处理程序返回该 Promise。

你实际上拥有了这个:

Promise.resolve.then(() => {
Promise.reject()
}).catch(/* cannot handle Promise.reject above */)

需要是这样的:

Promise.resolve.then(() => {
return Promise.reject();
}).catch(/* correctly handles above Promise.reject */)

实际上,您的代码应如下所示:

function getOrCreateUser (accessToken, refreshToken, profile, done) {
const user_props = obtainUserPropsFromGoogle(profile);
DBM.getUser(user_props.id_google).then( (res) => {
// Now that `createUser` returns its promise, this `return` is actually useful
return res[0] ? done(null, user_props) : createUser(done, user_props);
}).catch( error => {
done(error, null);
});
}

function createUser (done, user_props) {
// This promise must be returned out of `createUser`
return DBM.createUser(user_props).then(() => {
done(null, user_props);
})
}

关于javascript - 对于这个 promise 安排,我可以省略这个 catch block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59614961/

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