2016-09-13 1 views
2

Используя jQuery 3.1.0, я создаю неизвестное число запросов $.ajax() и добавляю полученные обещания в массив, используя:jQuery 3.1.0 then(), done() и когда() ошибка проглатывания

myArray.push($.ajax(...).promise()); 

После того, как все запросы будут завершены, я хочу, чтобы вызвать функцию, которую я понимаю, может быть сделано с помощью:

$.when.apply($, myArray).then(myFunction, errorHandlingFunction); 

Однако туРипсЫоп бросает ошибку, будучи проглоченного JQuery (во время тестирования вся моя функция была вызвана броском нового Error()). Я вижу, что выполнение входит в catch после вызова mightThrow() и правильно отклоняет отложенное, но это никогда не отображается в консоли.

Даже при выполнении следующего действия, которое опускает вызов приложения, происходит полное проглатывание ошибки; отладчик линия также не ударил:

myArray[0].then(function() { 
    throw new Error('test error'); 
}, function() { debugger; }); 

Удаление when() и выполняя следующие исполнения заставляет сломаться на бросок:

myArray[0].done(() => { 
    throw new Error('test error'); 
}).fail(function(){ debugger; }); 

кажется, что ошибки, возникающие в функции, выполняемые then() являются всегда проглатывается. Кроме того, $.when(...).done(...) также приводит к ошибке при проглатывании, если функция внутри done() выбрасывает.

Я что-то неправильно понял или это ошибка/особенность jQuery?

+0

см. Мой ответ, относящийся к вашему коду: http://stackoverflow.com/a/39206980/104380 – vsync

ответ

2

Вам нужно будет использовать .then(myFunction).fail(myErrorHandling). Выброс ошибки в течение myFunction отклонит новое обещание, созданное then(), которое затем может быть обработано в fail().

Функция обработки ошибок в .then(myFunction, myErrorHandling) вызывается, когда обещание, полученное от then(), отклонено. Это происходит только в том случае, если по крайней мере один из ваших запросов ajax от $.when() терпит неудачу.

+0

Это, должно быть, единственная комбинация, которую я не пробовал! Спасибо, отмечен как ответ. –

+0

Пожалуйста, прочтите [Как отформатировать мои сообщения с помощью Markdown или HTML?] (Http://meta.stackexchange.com/help/formatting) – Liam

-1

Для обещаний вы должны использовать .catch(function(error){}), или JQuery .fail(function(error){}), .then призван только к успеху, поэтому, если он выдает сообщение об ошибке, вы не можете его увидеть.

Javascript:

myArray[0].then(function() { 
    console.log('I am a success'); 
}).catch(function(error){ 
    console.error('I am an error', error); 
}); 

JQuery:

myArray[0].done(function() { 
     console.log('I am a success'); 
    }).fail(function(error){ 
     console.error('I am an error', error); 
    }); 

Приветствия

+0

Проблема будет проявляться, когда в вашем втором примере вызов console.log() выдал ошибку. Это произойдет тихо. –

+0

Это не так, просто попытался как примеры и ошибки забросил: Javascript: 'новый Promise (функция (решительность) { Resolve(); }), то (функция() { певд Error (. 'test error'); }, function() {debugger;}); ' JQuery: ' $.ajax ({method: 'get', url: 'http://swapi.co/api/planets/1/'}).promise().done(function(){throw new Error (' test error '); }); '. Если ошибка не выбрасывается вам, это означает, что что-то не так. –

+0

В последнем примере измените '.done()' на 'then()' или попробуйте обернуть обещание в '$ .when()'. Это вызвало мою проблему, на которую был дан ответ. –

Смежные вопросы