我有一个函数upload_image,它从表单上传文件并返回表示ajax请求的promise。但是,用户可能还没有选择该表单上的文件,在这种情况下我无法返回一个promise,因为没有ajax请求。但是,调用upload_image的代码需要返回ajax请求的承诺,因此done()和fail()函数假定ajax请求已完成或失败。所以问题是如果用户已经选择文件的前提条件失败,upload_image应该返回什么?
换句话说,处理由于不同原因可能失败的失败承诺的最佳做法是什么?
我考虑使用字符串“请选择一个文件”返回已经失败的承诺,然后在失败函数中检查它,但它看起来很糟糕。我还考虑将验证和ajax提交分成两个不同的功能,但对于这么少的功能来说,这似乎是太多的开销。
upload_image().done(function(){
// image uploaded succesfully
}).fail(function(jqxhr){
// error uploading OR image was not selected - what's the best way to handle this?
});
// pseudocode
function upload_image() {
if (!user_has_selected_a_file) {
// what to do here? maybe:
// return new $.Deferred().reject('Please select a file');
} else {
return $.ajax();
}
}
答案 0 :(得分:2)
最简单的方法可能是模拟jqXHR错误,这样错误处理程序只需要表面上知道失败是真正的jqXHR错误还是合成错误。
例如:
function upload_image() {
if (!user_has_selected_a_file) {
return $.Deferred().reject({simulated:true}, 'Please select a file', 'No file selected').promise();
} else {
return $.ajax(...);
}
}
然后,以最简单的形式,upload_image()
所做的回应可以如下结构:
upload_image().done(function(data, textStatus, jqXHR) {
// image uploaded succesfully
}).fail(function(jqXHR, textStatus, errorThrown) {
//display textStatus and/or errorThrown as required
});
或者,如果您需要区分两种类型的失败:
upload_image().done(function(data, textStatus, jqXHR) {
// image uploaded succesfully
}).fail(function(jqXHR, textStatus, errorThrown) {
if(jqXHR.simulated) {
//display textStatus and/or errorThrown as required
}
else {
//handle the genuine jqXHR and/or display textStatus and/or errorThrown as required.
}
});
答案 1 :(得分:0)
在失败功能中处理它。您已返回延迟调用,因为它是对.done / .fail
的逻辑调用答案 2 :(得分:0)
您可以手动创建Deferred object,使用.reject()
或.rejectWith()
立即将其置为失败,并从您的函数返回。您可以选择向其传递指示错误的参数。
附加到已经失败的Deferred对象的任何失败回调都将立即执行。