2017-08-15 19 views
0

動作が異なる理由を理解できません。予想通り、このバージョンのすべてで 作品:奇妙な未処理の約束の拒否

const debug = require("debug")("m"); 

const promise = new Promise((resolve, reject) => { 
    setTimeout(() => { 
     reject("promise rejected"); 
    }, 1000); 
}); 

promise.then(
    v => { 
     debug("resolve", v); 
    }, 
    e => { 
     debug("reject", e); 
    }, 
); 

の代わりに、catchハンドラを入れて、ハンドラを拒否:

const debug = require("debug")("m"); 

const promise = new Promise((resolve, reject) => { 
    setTimeout(() => { 
     reject("promise rejected"); 
    }, 1000); 
}); 

promise.then(v => { 
    debug("resolve", v); 
}); 

promise.catch(e => { 
    debug("catch: ", e); 
}) 

は同じに動作しますが、UnhandledPromiseRejectionWarning警告nodejs。これを理解するには?

答えて

2

thencatchについての重要なことの1つは、です。新しい約束を作成します。 (the Promises/A+ spec *およびthe JavaScript spec ["NewPromiseCapability"は、 "新しい約束を作成する"という仕様の方法です)。2番目の例のthenハンドラが約束を拒絶している理由は、その根本的な約束が拒否され、処理された。

チェーンだろうcatchでそれを行うための通常の方法:

promise 
    .then(v => { 
     debug("resolve", v); 
    }) 
    .catch(e => { 
     debug("catch: ", e); 
    }); 

そうすれば、何の未処理の拒否がない(と、もしあれば、thenコールバックにスローされたエラーはに拒否として伝播されますcatch)。


*約束/ A +はthenが同じ約束は実装が他のすべての要件を満たして返すことができますが、JavaScriptの約束はしないでください。

+0

ありがとうございました。 "promises/A + spec"にあります:2.2.7.4 onRejectedが関数ではなく、promise1が拒否された場合、promise2はpromise1と同じ理由で拒否されなければなりません。 – tilin

関連する問題