2016-03-02 56 views
-1

似乎以下工作而不发出一个错误: 无极捕行为

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 

任何乱撞为什么?

+1

时产生的返回值这是因为您没有在您的'p.then'链中处理错误...每个'p.then'或'p.catch'都是独立的,每个必须(最终)处理错误 –

回答

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

+0

我明白你的意思,但你会如何实现错误捕手从'setTimeout()'里面比?由于原生承诺没有任何'done()'方法。我不确定这是可能的。这当然是考虑到我给某人一个'承诺'并希望抓住他们犯下的最终错误。 – clenemt

+0

如果你想要的功能,最好的办法可能是让他们传递'next'功能与承诺的要求。所以,你会风与'函数createPromise(下){VAR P =新的承诺(函数(解析,拒绝){}); p.then(下).catch(函数(){的console.log( '错误夹缝')})' – jmcgriz

+0

是但它们比松动的可能性链的方法。 – clenemt