【发布时间】:2013-05-18 06:27:09
【问题描述】:
我有一个函数upload_image,它从表单上传文件并返回代表ajax 请求的promise。但是,用户可能尚未在该表单上选择文件,在这种情况下,我无法返回承诺,因为不会有 ajax 请求。但是,调用upload_image 的代码需要返回一个ajax 请求的promise,所以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();
}
}
【问题讨论】:
-
为什么返回一个失败的promise看起来很老套?这对我来说似乎很合理。
-
这并不比仅仅返回一个失败的承诺更好,但是如果验证失败,你总是可以在 ajax 调用中立即调用
abort(),就像在this fiddle中一样 -
@RayNicholus 看起来很老套,因为当没有任何延迟时,真的需要使用承诺。共识是,这是要走的路。
标签: javascript jquery ajax promise