Я пытаюсь запустить функцию, когда два этапа компиляции завершены, но обратный вызов успеха продолжает вызываться, даже если один из них не работает. Вот код:Promises.all не ударил блок catch(), когда одно обещание не удалось?
function compile(tplStr) {
return new Promise(function(resolve,reject) {
// compile template here
var tpl = new function(){};
resolve(tpl);
});
}
function parse(json) {
return new Promise(function(resolve,reject) {
try {
var obj = JSON.parse(json);
resolve(obj);
} catch(err) {
console.log('JSON parse failed');
reject(err);
}
});
}
var i = 0;
function bothReady() {
$('#c').text(++i);
}
function oneFailed(err) {
console.log('oneFailed hit');
$('#c').text(err.message);
}
var compileProm = compile($('#a').val());
var parseProm = parse($('#b').val());
Promise.all([compileProm,parseProm]).then(bothReady).catch(oneFailed);
$('#a').on('input', function() {
Promise.all([compile($('#a').val()),parseProm]).then(bothReady).catch(oneFailed);
});
$('#b').on('input', function() {
Promise.all(compileProm,parse($('#b').val())).then(bothReady).catch(oneFailed);
});
Когда я создаю ошибку синтаксиса в части JSON он регистрирует «JSON синтаксического анализа не удалось», но делает не журнала «oneFailed хит», как я ожидал. Почему нет? Должен ли быть запущен блок .catch
, если какое-либо из обещаний отклонено?
[Работает для меня] (http://codepen.io/anon/pen/kDtCa) после того, как я добавил jQuery и RSVP в ручку кода. – Bergi
Однако ваш код иногда записывает 'oneFailed hit', но * not *' JSON.parse failed', потому что вы не обновляли переменные 'compileProm' и' parseProm'. – Bergi
@ Bergi Aha! Спасибо! – mpen