我在AJAX中使用jQuery,但在应用程序中的其他地方使用了Q,因此希望确保Promise实现的一致性。
我用Q包裹了jQuery AJAX调用,如下所示:
Q($.ajax(url, {
type: 'get'
}));
对于成功的响应,一切正常。现在,我要添加错误处理,我要进行全局错误处理(因为我们从服务器收到一致的错误响应),因此制作了一个API,如下所示:
var xhr = function (url) {
return Q($.ajax(url, {
type: 'get'
}))
.then(function (data) {
return data;
}, function (res) {
//global error handling
});
};
我希望这样使用它:
xhr('...').then(function () { console.log('success'); });
问题是当全局错误处理程序在
xhr
方法的使用者使用时运行“成功”方法时。您将如何预防?
可以在此处看到可运行的示例-http://jsbin.com/gudifu/3/edit
最佳答案
由于jQuery的标准 promise ,您必须跳过圈将错误传递给Q强制 promise 。
首先,jqXHR的错误签名为(jqXHR, textStatus, errorThrown)
,并且您通常希望传递第二个参数textStatus
。
其次,这两个promise实现在错误处理方面有很大不同:
.then()
错误回调返回了新的,已解决的 promise 。保证.fail()
传播错误状态,而不管返回什么。未捕获的throw
将终止事件线程。 .catch()
,.fail()
或.then()
错误回调改写错误或抛出新错误,否则将错误标记为“已处理”(即,将错误发送到成功路径),在这种情况下,promise会沿着错误路径继续。 因此,您需要:
.then(null, errHandler)
链接到您的jQuery.ajax()
调用中,以便报告textStatus
var xhr = function (url) {
return Q($.ajax(url, {
type: 'get'
}).then(null, function(jqXHR, textStatus, errorThrown) {
return textStatus;
})).then(function (data) {
return data;
}, function (textStatus) {
//global error handling
throw new Error(textStatus);
});
};
您也可以从jQuery抛出适当的错误,然后从Q重新抛出错误。
var xhr = function (url) {
return Q($.ajax(url, {
type: 'get'
}).then(null, function(jqXHR, textStatus, errorThrown) {
return new Error(textStatus);
})).then(function (data) {
return data;
}, function (err) {
//global error handling
throw err;
});
};
两种解决方案的净效果几乎相同。我想我说的很对,如果记录了错误,它们将显示不同的错误行号-前者源自Q,后者源自jQuery。
关于jquery - 错误处理jQuery AJAX Promise与Q,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29024611/