承诺捕获行为

Promise catch behavior

似乎以下工作没有抛出错误:

var p = new Promise (function (resolve, reject) {
    window.setTimeout(function() {
        reject('ko');
    }, 1000);
});

p.then(function (value) { console.log(value); })
.catch(function () { console.log('catched'); });
// → 'catched'

但这会引发错误:

var p = new Promise (function (resolve, reject) {
    window.setTimeout(function() {
        p.catch(function () { console.log('catched'); });
        reject('ko');
    }, 1000);
});

p.then(function (value) { console.log(value); });
// → 'catched'
// Uncaught (in promise) ko

有没有想过为什么?

.catch 必须直接链接在 .then 之后。即使这样写,还是会报未捕获:

var p = new Promise(function(resolve, reject) {
  window.setTimeout(function() {
    //p.catch(function () { console.log('catched'); });
    console.log(p)
    reject('ko');
  }, 1000);
});

p.then(function(value) {
  console.log(value);
});
p.catch(function() {
  console.log('catched');
});

这样做的原因是,如果您不那样链接它,.catch 函数将不会收到您调用 .then 时生成的 return 值