我什么时候应该使用哪个?以下是一样的吗?
新的 Promise() 示例:
function multiRejectExample(){
return new Promise(function (resolve, reject){
if(statement){
console.log('statement 1');
reject(throw new Error('error'));
}
if(statement){
console.log('statement 2');
reject(throw new Error('error'));
}
});
}
Promise.try() 示例:
function tryExample(){
return Promise.try(function(){
if(statement){
console.log('statement 1');
throw new Error('error');
}
if(statement){
console.log('statement 2');
throw new Error('error');
}
});
}
最佳答案
在这种情况下,您可以主要使用其中一种(有一个行为差异)。第一个是标准的 promise 功能,可以与任何 promise 库一起使用。
Promise.try()
是 Bluebird 库专门实现的一项功能,不属于我所知道的任何标准流程。
使用 Promise.try()
的原因是如果您有一个返回 promise 的函数,但生成该 promise 的代码也可能导致同步异常。由于该异常不在任何 promise 处理程序中,因此您将混合使用错误处理。某些代码执行路径可能会导致返回将解决或拒绝的 promise ,而其他代码执行路径可能会引发异常。为了安全地编写代码,您必须响应 promise 并在变得笨拙的代码周围放置一个 try/catch block 。
Promise.try()
只是一种自动捕获任何异常并将其转化为拒绝的方法(类似于 .then()
处理程序中发生的情况)。
在你的两种情况下,Promise.try()
不会以这种方式让你受益,因为 new Promise()
回调已经捕获异常并将它们变成拒绝,所以该功能已经在那里为您完成。您可以在此处看到演示:http://jsfiddle.net/jfriend00/wLov9844/
Bluebird 文档提供了这个示例,它更清楚地显示了好处:
function getUserById(id) {
return Promise.try(function() {
if (typeof id !== "number") {
// Courtesy of Promise.try() this exception will be turned
// into a returned promise that is rejected with the
// exception as the reason
throw new Error("id must be a number");
}
return db.getUserById(id);
});
}
getUserById().then(successFn, errFn);
此处使用 Promise.try()
可确保 getUserById()
始终返回一个 promise,即使该方法中的代码同步抛出异常也是如此.这简化了 getUserById()
的使用,因为您始终可以只响应 promise 而不必围绕它使用自己的异常处理程序。
如果没有 Promise.try()
,您可以像这样自己编写相同的代码(以捕获函数内所有可能的同步异常):
function getUserById(id) {
try {
if (typeof id !== "number") {
throw new Error("id must be a number");
}
return db.getUserById(id);
} catch(e) {
return Promise.reject(e);
}
}
getUserById().then(successFn, errFn);
或者,您可以这样编码:
function getUserById(id) {
if (typeof id !== "number") {
throw new Error("id must be a number");
}
return db.getUserById(id);
}
try {
getUserById().then(successFn, errFn);
} catch(e) {
errFn(e);
}
据推测,您可以看到 Promise.try()
在某些情况下如何简化事情。
仅供引用,在您的第一个示例中,您使用的语法无效。你可以这样做:
reject(throw new Error('error'));
我假设你的意思是这样的:
reject(new Error('error'));
虽然我不认为这真的是您要问的问题,但如果您自己不返回 promise ,Promise.try()
也会自动返回已解决的 promise 。由于通过您的第一个示例的一条路径没有解决或拒绝,因此这将导致您的两个示例有所不同。
关于javascript - Bluebird.JS Promise : new Promise(function (resolve, reject){}) vs Promise.try(function(){}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32148305/