javascript - Promise 链接错误不会正确传递给 catch
问题描述
这是我的代码:
// promise chain being run onClick
function clickSequence(paramObj) {
checkForDuplicateNums(paramObj)
.then(() => {
checkForDuplicateEmails(paramObj);
})
.then(() => {
insertReservationForm(paramObj);
})
.then(() => {
sendEmail(paramObj);
})
.then(() => {
updateResBtnCounter(paramObj);
})
.then((pageUrl) => {
goToPage(pageUrl);
});
.catch((err) => {
displayErrorMsg(err);
})
}
// display sweet alert 2 modal
function displayErrorMsg(err) {
Swal.fire({
title: 'error',
icon: 'error',
text: `${err}`
});
}
// checking for duplicate numbers in DB
function checkForDuplicateNums(paramObj) {
console.log('checkforduplicatenums');
const { campaignId, numberInputValue, errorMsg } = paramObj;
functionName = "checkForDuplicatesNums";
return new Promise((resolve, reject) => {
$.ajax({
type: "POST",
url: "./includes/ajax_general_utilities.php",
data: {
functionName,
campaignId,
numberInputValue,
},
cache: false,
success: function(resp) {
if (resp === 'true') {
reject(new Error(`${errorMsg}`));
} else {
resolve();
}
},
error: function(err) {
console.error(err);
}
}); // close ajax
}); // close promise
}
// checking for duplicate emails in DB
function checkForDuplicateEmails(paramObj) {
const { emailInputValue, campaignId, errorMsg } = paramObj;
functionName = "checkForDuplicateEmails";
return new Promise((resolve, reject) => {
$.ajax({
type: "POST",
url: "./includes/ajax_general_utilities.php",
data: {
functionName,
campaignId,
emailInputValue
},
cache: false,
success: function (resp) {
if (resp === 'true') {
reject(new Error(`${errorMsg}`));
} else {
resolve();
}
},
error: function (err) {
console.error(err);
}
}); // close ajax
}); // close promise
}
我正在尝试将一堆函数链接在一起,其中我将一个 ajax 调用包装在一个 Promise 中。 checkForDuplicateEmails
并checkForDuplicateNums
检查数据库中是否存在重复值,如果发现重复值,则调用reject()
. 然后,我将一条错误消息传递给displayErrorMessage
显示sweet alert 2
模式的 catch 块中的函数名称。
我正在单独测试每一个以确保它们正常工作,但我遇到了问题。我硬编码了我知道的值已经在数据库中,以确保reject()
被调用。当我注释掉除第一个函数之外的所有内容时checkForDuplicateNums
,会抛出错误,并且它被正确传递给displayErrorMsg
并弹出一个模式。如果我取消注释第一个.then()
调用并更改它以便checkForDuplicateNums
解决,而不是checkForDuplicateEmails
将错误消息正确显示为模式,我只会在控制台中收到一个错误,如下所示:
Uncaught (in promise) Error: <then it displays error message only in console>
at Object.success (<page url>:231)
at c (jquery-3.5.1.min.js:2)
at Object.fireWith [as resolveWith] (jquery-3.5.1.min.js:2)
at l (jquery-3.5.1.min.js:2)
at XMLHttpRequest.<anonymous> (jquery-3.5.1.min.js:2)
我不确定为什么模态框只会在调用第一个函数时弹出而不是在那之后弹出,我假设我没有完全正确地使用承诺,但我似乎无法通过搜索找到特定于我的情况的答案网上左右。
解决方案
推荐阅读
- function - VSCode在自动完成函数时添加括号
- dart - 如何在 Angular Dart 项目中提供多个不同的目录?
- python - 从python中的kibana查询?
- html - "justify-content-md-end" 和 "justify-content-center" 行为相反
- xml - 尝试删除仅由 http 访问的文件时访问被拒绝
- dart - http.get() 没有在标题中添加我的参数
- java - JTable 单元格编辑器功能不适用于第二行
- sql - 如何从 SQL Server 中删除重复记录?
- c# - ASP.NET Core - 同时使用 UseDeveloperExceptionPage() 和自定义日志记录
- python - 如何选择策略来减少过拟合?