#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
andparseProm
.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.