Javascript 承诺捕获行为

Javascript 承诺捕获行为,javascript,promise,ecmascript-6,es6-promise,Javascript,Promise,Ecmascript 6,Es6 Promise,似乎以下操作不会引发错误: 但这带来了一个错误: 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(va

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

但这带来了一个错误:

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
直接链接在
之后。即使您这样写,它仍然会报告未完成:

var p=新承诺(函数(解析、拒绝){
setTimeout(函数(){
//p、 catch(函数(){console.log('catched');});
console.log(p)
拒绝(“ko”);
}, 1000);
});
p、 然后(函数(值){
console.log(值);
});
p、 catch(函数(){
console.log('catched');

});这是因为您没有处理
p中的错误。。。每个
p.then
p.catch
都是独立的,每个都必须(最终)处理错误我明白你的意思,但是你如何从
setTimeout()内部实现错误捕捉器呢?因为本机承诺没有任何
done()
方法。我不确定这是否可能。当然,这是考虑到这样一个事实,即我正在给某人一个
承诺,并希望捕捉他们最终在承诺中犯下的错误。如果你想要这个功能,你最好的办法可能是让他们通过一个
下一个
函数,并请求承诺。因此,您将得到
function createPromise(next){var p=new Promise(function(resolve,reject){});p.then(next).catch(function(){console.log('Error catch')})
Yes,但是他们失去了链接方法的可能性。我想接下来的问题是谁“他们”是的,听起来他们可能需要自己处理错误。
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