Ajax 如何使包装好的jQuery承诺在出现错误时触发拒绝回调?
我正在用RSVP包装一个简单的jQuery承诺,并注意到当我故意导致错误时,不会调用失败回调。我认为这是因为当您使用vanilla jQuery并且回调抛出错误时,返回的承诺不会被移动到失败状态(与规范相反) 如果我需要使用jQuery$.ajax,但我想通过RSVP获得真正的解析/拒绝回调,那么我可以对下面的示例做什么(如果有的话)Ajax 如何使包装好的jQuery承诺在出现错误时触发拒绝回调?,ajax,jquery,rsvp.js,Ajax,Jquery,Rsvp.js,我正在用RSVP包装一个简单的jQuery承诺,并注意到当我故意导致错误时,不会调用失败回调。我认为这是因为当您使用vanilla jQuery并且回调抛出错误时,返回的承诺不会被移动到失败状态(与规范相反) 如果我需要使用jQuery$.ajax,但我想通过RSVP获得真正的解析/拒绝回调,那么我可以对下面的示例做什么(如果有的话) var peoplePromise = new Ember.RSVP.Promise(function(resolve, reject) { $.get
var peoplePromise = new Ember.RSVP.Promise(function(resolve, reject) {
$.getJSON('/api/people/', resolve).fail(reject).error(reject);
});
var catPromise = new Ember.RSVP.Promise(function(resolve, reject) {
$.getJSON('/api/cats/', resolve).fail(reject).error(reject);
});
Ember.RSVP.all([peoplePromise, catPromise]).then(function(things) {
things[0].forEach(function(hash) {
var thing = App.Person.create(hash);
Ember.run(self.people, self.people.pushObject, thing);
});
things[1].forEach(function(hash) {
var wat = hash.toJSON(); //this blows up
var thing = App.Person.create(hash);
Ember.run(self.people, self.people.pushObject, thing);
});
}, function(value) {
alert(value.status + ": promise failed " + value.responseText);
});
示例如下:
要正确转换到Ember中的错误路径,需要将
拒绝(参数)
替换为拒绝(新错误('your_message'))
。有限,我修改了我的答案。从options.error中传递错误就足够了,我觉得添加默认错误消息很难理解。@使用此选项后,我发现传递所有3条消息是最有用的。更新。
var ajaxPromise = function(url, options){
return Ember.RSVP.Promise(function(resolve, reject) {
var options = options || {};
options.success = function(data){
resolve(data);
};
options.error = function(jqXHR, status, error){
reject([jqXHR, status, error]);
};
$.ajax(url, options);
});
};
var peoplePromise = ajaxPromise('/api/people/',{
dataType: "json"
});
var catPromise = ajaxPromise('/api/cats/',{
dataType: "json"
});
Ember.RSVP.all([peoplePromise, catPromise]).then(function(things) {
things[0].forEach(function(hash) {
var thing = App.Person.create(hash);
Ember.run(self.people, self.people.pushObject, thing);
});
things[1].forEach(function(hash) {
var wat = hash.toJSON(); //this blows up
var thing = App.Person.create(hash);
Ember.run(self.people, self.people.pushObject, thing);
});
}, function(args) {
var jqXHR = args[0];
alert(jqXHR.status + ": promise failed " + jqXHR.responseText);
});