2015-07-03 72 views
1

由于jQuery.ajax api是$.Deferred()的扩展我试图让ajax调用与承诺模式失败并完成。是否可以识别/忽略某些拒绝/失败回调?

$.ajax(..).done(..).fail(..) 

并用它来制作某种Api助手。

function ApiHelper() { 

    ... 
    this.get = function (path, data) { 
     return ajax('GET', path, data); 
    }; 
} 

问题:

目前,我需要两种类型的错误处理。一些全球和一些指定。

如果没有具体的错误,我想处理全局失败。否则,由定义的一个。

我想这样做:

apiHelper.get('path/to/api').done(function() { 
    //all good 
}) 

function globalHandler() { 
    //everything goes wrong. notify here. 

}  
apiHelper.get('path/to/api').done(function() { 
    //all good 
}).fail(function() { 
    //everything goes wrong., notify here. and ingnore globalHandler. 
}) 

可以识别,如果爽约,没有人处理呢?或忽略一些失败回调?

+1

“与失败,并做了承诺架构” - 实际上是承诺架构'then',完成,失败是,对于传统形式的存在jQuery的具体方法原因。 –

+1

这是诺基亚很高兴为您顺利完成的任务(全局错误处理)。如果你可以修改使用像Bluebird这样的东西,这是一块蛋糕。 –

回答

2

如果没有具体的错误,我想处理全局失败。 否则,由定义的一个。

注意,.ajaxComplete.ajaxError出现.done.fail之后调用

尝试处理错误的设置标志handled;利用 .ajaxComplete $.ajaxSetup()

var handled = false; 

$.ajaxSetup({ 
    error: function (jqxhr, textStatus, errorThrown) { 
     console.log("ajaxSetup:", errorThrown); 
     // set , reset `handled` flag here 
     handled = true 
    } 
}); 
// returns error 
var request = $.post("/echo/jsons/", { 
    json: JSON.stringify(["abc"]) 
}); 
request.done(function (data) { 
    console.log(data) 
}); 
request.fail(function (jqxhr, textStatus, errorThrown) { 
    if (!handled) { 
     console.log("fail:", errorThrown) 
    } else { 
     console.log(handled); 
    } 
}); 

的jsfiddle http://jsfiddle.net/o8gsdyaj/

+0

使用.ajaxComplete/.ajaxStop/.ajaxError是一个很好的方法,但是如果请求错误是在以前处理过的话,仍然不能改变。 – vmariano

+1

@vmariano'.ajaxComplete','.ajaxError'似乎被称为_after_'.done','.fail'。替代设置全局“标志”,默认''错误'处理程序在'$ .ajaxSetup',看起来叫做_before_'.done','.fail';查看更新的帖子。 – guest271314

+0

Thankx @ guest271314我做了一个类似的workarround,面向事件,而不是使用全局变量。但是,谢谢。 – vmariano