首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保某些步骤发生在承诺链或提前停止链中

确保某些步骤发生在承诺链或提前停止链中
EN

Stack Overflow用户
提问于 2020-01-15 00:05:00
回答 1查看 32关注 0票数 0

我正在尝试将一些数据库数据与本地数据同步。具体来说,我希望从数据库“加载”一个LinkTable ( load函数本身,处理数据的合并),然后,在load函数之后,我想将LinkTable推到数据库中。完成后,所期望的结果将是数据库和LinkTable的本地版本将是相同的。更复杂的是,负载函数可以以可以接受的方式拒绝.如果是这样的话,我需要继续沿着承诺链走下去。

最后,在LinkTable同步之后.我需要做一些依赖于LinkTable的额外任务。

我正在使用react/redux,但问题更多是关于承诺。

相关(失败)代码如下所示:

代码语言:javascript
复制
     dispatch(loadLinkTableFromDB(username))
            .then((successLoadLinkTableMsg) => {
                console.log('Successfully loaded link table: ', successLoadLinkTableMsg)
                return dispatch(pushLinkTableToDB(username))
            })
            .catch((rejectLoadLinkTableReason) => {
                console.log("Failed to load link table from DB: " + rejectLoadLinkTableReason);
                if (allReasonsAcceptableForOverwrite(rejectLoadLinkTableReason)) {  // some rejection reasons are accectable... so if failed reason is okay.... 
                    return dispatch(pushLinkTableToDB(username));
                } else {
                    // console.log("Rejecting: ", rejectLoadLinkTableReason);
                    return Promise.reject(rejectLoadLinkTableReason); 
                }
            })
            .catch((unacceptableRejectionReasons) => {
                console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
            })
            .then(( *do more stuff that relies on the LinkTable *))

我的问题是,一个不可接受的拒绝在加载LinkTable.在将链接表从第一次追赶中推开时,任何类型的拒绝最终都会被第二次捕获所捕获。当这是一个不可接受的拒绝,我希望整个承诺链结束。当这是一个可以接受的拒绝,然后在pushLinkTableToDB的后续拒绝.我希望承诺链继续下去。

EN

回答 1

Stack Overflow用户

发布于 2020-01-15 00:13:08

您将希望使用.then(…, …) instead of .then(…).catch(…)只处理来自loadLinkTableFromDB的拒绝,而不处理来自pushLinkTableToDB的拒绝

代码语言:javascript
复制
dispatch(loadLinkTableFromDB(username))
.then(loadLinkTableResultMsg) => {
    console.log('Successfully loaded link table: ', loadLinkTableResultMsg)
    return dispatch(pushLinkTableToDB(username))
}, loadLinkTableErrorReason => {
    console.log('Failed to load link table from DB: ', loadLinkTableErrorReason);
    if (allReasonsAcceptableForOverwrite(loadLinkTableErrorReason)) {
        return dispatch(pushLinkTableToDB(username));
    } else {
        throw loadLinkTableErrorReason; 
    }
})
.then( /* do more stuff that relies on the LinkTable */ )
.catch(unacceptableRejectionReasons => {
    console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
})

但是,在这两种情况下,如果您想要pushLinkTableToDB,则可能希望将其向下移动并删除复制:

代码语言:javascript
复制
dispatch(loadLinkTableFromDB(username))
.then(loadLinkTableResultMsg) => {
    console.log('Successfully loaded link table: ', loadLinkTableResultMsg)
}, loadLinkTableErrorReason => {
    console.log('Failed to load link table from DB: ', loadLinkTableErrorReason);
    if (!allReasonsAcceptableForOverwrite(loadLinkTableErrorReason)) {
        throw loadLinkTableErrorReason; 
    }
})
.then(() => dispatch(pushLinkTableToDB(username)))
.then( /* do more stuff that relies on the LinkTable */ )
.catch(unacceptableRejectionReasons => {
    console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
})

如果没有日志消息,也只能使用catch --只需将其放在pushLinkTableToDB调用之前:

代码语言:javascript
复制
dispatch(loadLinkTableFromDB(username))
.catch(loadLinkTableErrorReason => {
    if (!allReasonsAcceptableForOverwrite(loadLinkTableErrorReason)) {
        throw loadLinkTableErrorReason; 
    }
})
.then(() => dispatch(pushLinkTableToDB(username)))
.then( /* do more stuff that relies on the LinkTable */ )
.catch(unacceptableRejectionReasons => {
    console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
})

如果您控制loadLinkTableFromDB函数,您甚至可能会考虑将catch调用移到该函数中,这样返回的承诺只会以不可接受的错误拒绝,否则会得到合理的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59743498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档