【问题标题】:Catching Errors from Promise construction从 Promise 构造中捕获错误
【发布时间】:2016-02-05 06:17:56
【问题描述】:

有没有更好的方法来使用 Bluebird Promise 进行以下操作

Promise.resolve()
    .then(function() {return new MyObject(data)})
    .then.....etc
    .catch(function (e){ //handle it}) 

我有 MyObject - 并且从外部系统传入的数据可能是无效的,因此可能会破坏承诺链。将对象创建包装在一个函数中,然后看起来真的很混乱。有没有类似的东西

Promise.something(new MyObject(data))
       .then()....
       .catch....

另外 - 节点 0.10 所以没有 Lambda 让它看起来更整洁:-(

【问题讨论】:

  • 如果您从先前的承诺中获得data,则需要以一种或另一种方式使用then。你到底在找什么?减少function (data) { return new MyObject(data) }的方法?
  • 您是否可能正在寻找Promise.resolve(new MyObject(data)) 以从MyObject 生成承诺?
  • @zzzzBov 听起来 OP 希望承诺捕获new MyObject 可能抛出的任何异常(@Silver,对吗?)

标签: javascript node.js promise bluebird


【解决方案1】:

而不是运行new MyObjectPromise.something(new MyObject(data))创建 Promise 之前,使用长格式的 Promise 构造函数:

new Promise(function (resolve) {
  resolve(new MyObject(data));
}.then(foo).catch(bar);

在 Promise 构造函数或 then 回调中同步抛出的异常将被捕获、处理(包括类型匹配),并发送到 catch 处理程序 (Bluebird docs)。

【讨论】:

    【解决方案2】:

    当然有,Promise.try,您也应该在 Node 中使用箭头表示短函数表达式:

    Promise.try(() => new MyObject(data));
    

    与浏览器一样,您可以将a transpiler 用于旧版本的 Node.js。

    另外,我不会在构造函数中执行 IO,但那是另一回事。 ssube 的另一个答案解释了为什么需要构造函数,因为在实际调用方法之前会发生异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-08
      • 2015-07-21
      • 1970-01-01
      • 2018-01-14
      • 2021-04-21
      • 2022-08-19
      • 2019-04-04
      • 2017-05-06
      相关资源
      最近更新 更多