2016-03-02 55 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