2

我有一个函数 upload_image 从表单上传文件并返回代表 ajax 请求的承诺。但是,用户可能尚未在该表单上选择文件,在这种情况下,我无法返回承诺,因为不会有 ajax 请求。但是,调用upload_image 的代码需要返回一个ajax 请求的promise,所以done() 和fail() 函数假定ajax 请求完成或失败。所以问题是,如果用户已经选择文件的前提条件失败,upload_image 应该返回什么?

换句话说,处理可能由于不同原因而失败的失败承诺的最佳实践是什么?

我考虑返回一个已经失败的承诺,并带有一个字符串“请选择一个文件”,然后在失败函数中检查它,但这似乎很hacky。我还考虑将验证和 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();
  }
}
4

3 回答 3

3

最简单的方法可能是模拟一个 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.
    }
});
于 2013-05-23T04:08:25.077 回答
0

在你的失败函数中处理它。您已返回延迟调用,使其成为对 .done / .fail 的逻辑调用

于 2013-05-23T02:37:52.997 回答
0

您可以手动创建一个Deferred object,立即使用.reject()or使其失败,.rejectWith()然后从您的函数中返回它。您可以选择将指示错误的参数传递给它。

任何附加到已经失败的 Deferred 对象的失败回调都将立即执行。

于 2013-05-23T02:42:31.647 回答