处理因多种原因可能失败的jQuery承诺

时间:2013-05-23 02:30:23

标签: javascript jquery ajax promise

我有一个函数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();
  }
}

3 个答案:

答案 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对象的任何失败回调都将立即执行。