Javascript JS Promise reject执行then块并抛出错误
我试图为ajax调用创建一个Javascript承诺。如果它返回正确的响应,则我正在解决它,并已将对应的块附加到承诺。如果它拒绝,我有一个捕获块。不幸的是,对我来说,即使我拒绝,承诺中的那一块也会被执行。请帮我解决这个问题。下面是我在应用程序中使用的代码块Javascript JS Promise reject执行then块并抛出错误,javascript,es6-promise,Javascript,Es6 Promise,我试图为ajax调用创建一个Javascript承诺。如果它返回正确的响应,则我正在解决它,并已将对应的块附加到承诺。如果它拒绝,我有一个捕获块。不幸的是,对我来说,即使我拒绝,承诺中的那一块也会被执行。请帮我解决这个问题。下面是我在应用程序中使用的代码块 function check (){ return new Promise ((resolve, reject) => { $.ajax({ type:"get",
function check (){
return new Promise ((resolve, reject) => {
$.ajax({
type:"get",
url : "API",
data:{"jsonData":"validJsonData"},
async:true,
success:function(responseMap){
if(responseMap.data && JSON.parse(responseMap.data)) {
resolve(responseMap)
}else{
reject(responseMap.message)
}
},error : function(errorObj){
reject(errorObj)
}
}).then(result => {
let obj= JSON.parse(result.data);
// process obj
loader.hide();
}).catch(error => {
console.log(error)
// error handle logic
loader.hide();
});
});
}您正在使用,因为$.ajax已经返回了一个承诺
另外,$.ajax的success
回调不是它的承诺链的一部分,因此请使用then()
您的代码应该更像:
function check() {
// return the $.ajax promise
return $.getJSON(url, { "jsonData": "validJsonData" }).then(function(responseMap) {
// not sure why you had extra JSON.parse() in here
if (responseMap.data) {
return responseMap.data
} else {
return Promise.reject(responseMap.message)
}
}).then(function(result) {
loader.hide();
// return to next then()
return result
}).catch(error => {
console.log(error)
// error handle logic
loader.hide();
});
}
// usage
check().then(data=>console.log(data))
你的错误是什么?一些“错误”是来自服务器的完全有效的响应,不会被解释为错误,因此不会捕获。可能是
asyncServerResponseValid
不是您所期望的。另外,尝试获取所示的承诺实际上没有意义,因为所示的内容都不是异步的。asyncServerResponseValid
来自哪里?它是什么?@something首先,感谢您的评论。正如您所指出的,在我的例子中,错误是来自API的有效响应。不幸的是,我已将错误消息的响应状态代码设置为200。现在我将其更改为404,jquery将其视为错误并拒绝。非常感谢你为我指明了正确的方向。另外,感谢您推荐FetchAPI。在我的例子中,这比使用jQueryAjax调用有很多好处。我将重构为相同的模式。将$.ajax()
包装在承诺中是一种反模式,因为它已经返回了一个您可以使用的承诺。您已经可以执行$.ajax(…)。然后(…)
。我仍然不明白,当浏览器中存在本机获取API时,为什么最终批准的答案仍然使用jQuery。除了熟悉或传统之外,没有理由不再使用jQuery了,但每个人都只是不断地指向它。不管怎样,很高兴知道你的问题解决了!