2017-08-15 153 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); 
}) 

的工作方式相同,但警示的NodeJS UnhandledPromiseRejectionWarning。如何理解这一点?

回答

2

关于thencatch的关键之一是他们创造了新的承诺。 (请参见the Promises/A+ spec *和the JavaScript spec [“NewPromiseCapability”是规范中“创建新承诺”的说法]。)第二个示例中承诺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

相关问题