javascript - Bluebird.JS Promise : new Promise(function (resolve, reject){}) vs Promise.try(function(){})

标签 javascript promise bluebird

我什么时候应该使用哪个?以下是一样的吗?

新的 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/

相关文章:

PHP + Javascript - 读/写 Cookie

javascript - 是否可以在移动设备旋转时使用 Javascript/CSS 交换样式表?

javascript - 如何从 Canvas 初始化图像?

javascript - Promise.catch 正在吞噬错误

javascript - ES6 Promise 替换 async.eachLimit/async.mapLimit

javascript - Syncano Codebox - 调用 API - 解析 JSON - 获取引用 - 保存新对象

javascript - 无法读取未定义错误的属性 'filter'

javascript - 在 Angular 服务模块中返回 Angular promise

javascript - 调用异步函数未按预期工作

node.js - `fs-extra` 与 `bluebird ` 集成得到 `Cannot read property ' 然后 ' of undefined` 错误