Обещания.all не попадает в блок catch() при сбое одного обещания?

#javascript #promise #rsvp.js

#javascript #обещание #rsvp.js

Вопрос:

Я пытаюсь запустить функцию после завершения двух этапов компиляции, но успешный обратный вызов продолжает вызываться даже при сбое одного. Вот код:

 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», но не регистрирует «сбой с ошибкой», как я ожидал. Почему бы и нет? Не .catch следует ли запускать блок, если какое-либо из обещаний отклонено?

Комментарии:

1. Работает для меня после того, как я добавил jQuery и RSVP в code pen.

2.Однако ваш код иногда регистрируется oneFailed hit , но не JSON.parse failed потому, что вы не обновили переменные compileProm and parseProm .

3. @Bergi Ага! Спасибо!

Ответ №1:

Ваш код работает некорректно, когда что-то вводится внутри #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.