为什么我的承诺总是命中 catch() 方法?



我正在使用带有then((,catch((的JavaScript Promise对象。

无论来自 API 的响应("STATUS_SUCCESS"或"STATUS_FAILED"(如何,catch (( 方法中的控制台.log始终运行。

这是承诺中的正常行为,还是有没有办法在响应失败时只命中 catch(( 方法?

用实时示例更新:

sendAccountDataToBackend(response) {
const { formData } = response;
const requestObj = {
url: 'http://localhost:3000/api/validate',
data: {
firstname: 'dummy_firstname',
lastname: 'dummy_lastname',
email: 'dummyemail'
}
};
let p = new Promise((resolve, reject) => {
account.Utils.globalAjaxRequest(requestObj, (success) => {
if(success.status === 'STATUS_SUCCESS') {
resolve();
console.log('resolved: ', p)
} else {
reject();
console.log('rejected: ', p);
}
});
})
p.then(() => {
console.log('Then: ', response);
}).catch(() => {
console.log('catch:', response);
})
}

您可以通过打印它找到抛出错误的确切原因。

将捕获处理程序更改为如下所示:

catch((e) => {
console.log('Catch', e);
})

除了"Catch"之外,您还将在控制台中看到错误的描述。

多亏@pfcodes建议,我弄清楚了导致渔获着火的原因。我在 then(( 块中调用了一个失败的函数。一旦删除,它就会留在里面((。被忽视的愚蠢错误!感谢您的建议。

关于这个问题:

这是承诺中的正常行为,还是有没有办法在响应失败时只命中 catch(( 方法?

很容易证明,只有在进行reject调用时才会输入catch

function testPromise(shouldReject)
{
return  new Promise((resolve, reject) => {
setTimeout(function(){
if(shouldReject) reject();
else resolve();
},1000);
});
}
function handlePromise(p, name){
p.then(() => {
console.log(name, 'Then');
}).catch(() => {
console.log(name, 'Catch');
})
}
var rejectPromise = testPromise(true);
var resolvePromise = testPromise(false);
handlePromise(rejectPromise,"reject");
handlePromise(resolvePromise,"resolve");

因此,这意味着在您的代码中,无论出于何种原因(可能处理不当的异步 ajax 调用(,您都会进入else块。


关于您的更新,我想说success.status返回了"STATUS_SUCCESS">以外的内容,原因如上面的代码所示。

尝试在 ajax 回调中添加console.log(success)

account.Utils.globalAjaxRequest(requestObj, (success) => {
console.log(success);
....

最新更新