2014-06-28 4 views
1

Я пытаюсь запустить функцию, когда два этапа компиляции завершены, но обратный вызов успеха продолжает вызываться, даже если один из них не работает. Вот код: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); 
}); 

code pen

Когда я создаю ошибку синтаксиса в части JSON он регистрирует «JSON синтаксического анализа не удалось», но делает не журнала «oneFailed хит», как я ожидал. Почему нет? Должен ли быть запущен блок .catch, если какое-либо из обещаний отклонено?

+0

[Работает для меня] (http://codepen.io/anon/pen/kDtCa) после того, как я добавил jQuery и RSVP в ручку кода. – Bergi

+1

Однако ваш код иногда записывает 'oneFailed hit', но * not *' JSON.parse failed', потому что вы не обновляли переменные 'compileProm' и' parseProm'. – Bergi

+0

@ Bergi Aha! Спасибо! – mpen

ответ

3

Ваш код работает неправильно, когда что-то набирается внутри #b, потому что вместо передачи итерации на Promise.All вместо этого передаются 2 параметра.

Результатом является то, что при выполнении обоих обещаний только результат первого учитывается продолжением all.

Код чтения

Promise.all(compileProm,parse($('#b').val())).then(bothReady).catch(oneFailed); 

Вместо

Promise.all([compileProm,parse($('#b').val())]).then(bothReady).catch(oneFailed); 

PS: В 2 другие вызовы правильно это объяснить, почему эта проблема, кажется, происходит только при редактировании JSON.