【问题标题】:Promise catch behavior承诺捕获行为
【发布时间】:2016-06-15 12:53:57
【问题描述】:

似乎以下工作不会引发错误:

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

有什么疯狂的猜测吗?

【问题讨论】:

  • 这是因为你没有处理你的p.then链中的错误......每个p.thenp.catch都是独立的,每个都必须(最终)处理错误

标签: javascript promise ecmascript-6 es6-promise


【解决方案1】:

.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 时生成的返回值

【讨论】:

  • 我明白你的意思,但是你将如何从setTimeout() 内部实现一个错误捕获器而不是?由于本机承诺没有任何 done() 方法。我不确定这是否可能。这当然是考虑到我给某人Promise 并希望捕捉他们最终犯的错误。
  • 如果你想要那个功能,你最好的办法可能是让他们通过一个 next 函数来请求承诺。所以,你最终会得到function createPromise(next){ var p = new Promise(function(resolve, reject){}); p.then(next).catch(function(){ console.log('Error Caught') })
  • 是的,但他们比失去链接方法的可能性。
  • 我想这变成了“他们”是谁的问题,听起来他们可能需要在他们身边进行错误处理。
猜你喜欢
  • 2021-11-06
  • 2017-11-24
  • 2023-02-25
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2019-04-18
  • 2017-10-18
相关资源
最近更新 更多