当一个promise失败时,Promises.all没有命中catch()块?

时间:2014-06-28 18:36:37

标签: javascript promise 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);
});

code pen

当我在JSON部分创建语法错误时,它会记录" JSON解析失败"但 log" oneFailed hit"就像我期待的那样。为什么不?如果任何承诺被拒绝,那么.catch块是否应该被运行?

1 个答案:

答案 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时才会发生。