reactjs 未被抓住(在承诺中)

iszxjhcz  于 2023-02-08  发布在  React
关注(0)|答案(2)|浏览(95)

我知道这个问题很常见,我使用的是es6 promise,我有多个层,在运行时,当我没有捕捉到promise时,我的控制台里有Uncaught (in promise),但事实是我在代码的底层捕捉到了它。
快速简化示例:
LoginApi.js

var loginDaoCall = loginDao.login(username, password);

loginDaoCall
    .then(function (res) {
        store.dispatch(loginSuccess());
        log.log("[loginApi.login] END");
    })
    .catch(function (err) {
        store.dispatch(loginFail());
        errorUtils.dispatchErrorWithTimeout(errorLogin);
        log.log(err);
    });

return loginDaoCall;

loginContainer.js

loginApi.login(user, password).then(() => {
    // Change here instead of in render so the user can go back to login page
    this.props.history.push(baseUrlRouter + "test");
}); // <- Error here cause I don't CATCH the promise, but I do catch it in my loginapi.js

我知道我可以什么都不做,但是,我也可以在API层做历史推送,但是这不是它的责任。
我怎样才能避免控制台出错呢?有办法吗?我甚至在考虑就这样离开它。

nwlls2ji

nwlls2ji1#

您的问题是您正在return处理被拒绝的loginDaoCall,而不是错误已经被处理的承诺。loginApi.login(user, password)确实返回了被拒绝的承诺,并且即使在另一个分支中处理该承诺时,由另一个.then()返回的承诺也确实被拒绝并且没有被处理。
你可能会想做一些

// LoginApi.js
return loginDao.login(username, password).then(function (res) {
    store.dispatch(loginSuccess());
    log.log("[loginApi.login] END");
    return true;
}, function (err) {
    store.dispatch(loginFail());
    errorUtils.dispatchErrorWithTimeout(errorLogin);
    log.log(err);
    return false;
}); // never supposed to reject
// loginContainer.js
loginApi.login(user, password).then(success => {
    if (success) {
        // Change here instead of in render so the user can go back to login page
        this.props.history.push(baseUrlRouter + "test");
    }
});
chhqkbe1

chhqkbe12#

听起来像是catch块中有错误。当抛出错误时,没有第二个catch块来捕获第一个catch块中的错误。
为了修复它...

.then(function (res) {
    // some code that throws an error
})
.catch(function (err) {
    // some code that throws an error
})
.catch(function (err) {
    // This will fix your error since you are now handling the error thrown by your first catch block
    console.log(err.message)
});

相关问题