我正在尝试将一些数据库数据与本地数据同步。具体来说,我希望从数据库“加载”一个LinkTable ( load函数本身,处理数据的合并),然后,在load函数之后,我想将LinkTable推到数据库中。完成后,所期望的结果将是数据库和LinkTable的本地版本将是相同的。更复杂的是,负载函数可以以可以接受的方式拒绝.如果是这样的话,我需要继续沿着承诺链走下去。
最后,在LinkTable同步之后.我需要做一些依赖于LinkTable的额外任务。
我正在使用react/redux,但问题更多是关于承诺。
相关(失败)代码如下所示:
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的后续拒绝.我希望承诺链继续下去。
发布于 2020-01-15 00:13:08
您将希望使用.then(…, …) instead of .then(…).catch(…)只处理来自loadLinkTableFromDB的拒绝,而不处理来自pushLinkTableToDB的拒绝
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,则可能希望将其向下移动并删除复制:
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调用之前:
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调用移到该函数中,这样返回的承诺只会以不可接受的错误拒绝,否则会得到合理的结果。
https://stackoverflow.com/questions/59743498
复制相似问题