我试图在两个编译步骤完成时运行一个函数,但是即使一个失败,成功回调仍会被调用。这是代码:
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解析失败"但不 log" oneFailed hit"就像我期待的那样。为什么不?如果任何承诺被拒绝,那么.catch
块是否应该被运行?
答案 0 :(得分: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时才会发生。