У меня есть функция upload_image, которая загружает файл из формы и возвращает обещание, представляющее запрос ajax. Тем не менее, возможно, что пользователь еще не выбрал файл в этой форме, и в этом случае я не могу вернуть обещание, потому что не будет никакого запроса ajax. Однако код, вызывающий upload_image, ожидает обещание для запроса ajax, поэтому функции done() и fail() предполагают, что запрос ajax завершен или завершен. Итак, вопрос заключается в том, что должно возвращать upload_image, если предварительное условие пользователя, уже выбравшего файл, не удается?Обработка jQuery обещаний, которые могут быть сбой по нескольким причинам
Другими словами, что является наилучшей практикой для обработки неудачного обещания, которое может быть неудачным по разным причинам?
Я подумал о возвращении обещания, которое уже не выполнено, с строкой «Пожалуйста, выберите файл», а затем проверьте это в функции сбоя, но это кажется взломанным. Я также рассматривал возможность разделения валидации и представления 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();
}
}
Почему возвращение неудачного обещания кажется взломанным? Это кажется мне разумным. –
Не это лучше, чем просто возврат неудачного обещания, но вы всегда можете вызвать 'abort()' на вызов ajax немедленно, если проверка не прошла, как в [** this fiddle **] (http://jsfiddle.net/3etZa /) – adeneo
@RayNicholus кажется взломанным, потому что нет необходимости действительно использовать обещание, когда ничего не откладывается. Консенсус в том, что это путь. – mike