Javascript JS Promise reject执行then块并抛出错误

Javascript JS Promise reject执行then块并抛出错误,javascript,es6-promise,Javascript,Es6 Promise,我试图为ajax调用创建一个Javascript承诺。如果它返回正确的响应,则我正在解决它,并已将对应的块附加到承诺。如果它拒绝,我有一个捕获块。不幸的是,对我来说,即使我拒绝,承诺中的那一块也会被执行。请帮我解决这个问题。下面是我在应用程序中使用的代码块 function check (){ return new Promise ((resolve, reject) => { $.ajax({ type:"get",

我试图为ajax调用创建一个Javascript承诺。如果它返回正确的响应,则我正在解决它,并已将对应的块附加到承诺。如果它拒绝,我有一个捕获块。不幸的是,对我来说,即使我拒绝,承诺中的那一块也会被执行。请帮我解决这个问题。下面是我在应用程序中使用的代码块

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了,但每个人都只是不断地指向它。不管怎样,很高兴知道你的问题解决了!