【问题标题】:bluebirdjs coroutine error handling (browser)bluebirdjs 协程错误处理(浏览器)
【发布时间】:2016-12-01 19:20:33
【问题描述】:

我应该如何处理 bluebird 协程中的错误?

我在 node 中使用 co 有一段时间了,它有一个很好的 catch 功能。

co(function*() {

    return new Promise(function(resolve, reject) {
        // whatever stuff
    });

}).catch(function(err) {console.error(error.stack)});

但是在浏览器/客户端使用蓝鸟,这简直就是一场噩梦。没有 catch 函数,我返回的错误(如果有的话)要么是匿名的,要么是未处理的,这完全是脑残......

我在 bluebirdjs 的网站上查看过,几个月前有关于如何处理错误的讨论。终于有人写道:

应该有一个更好的例子来强调在协程中使用 try、catch 和 finally 的好处。

http://bluebirdjs.com/docs/api/promise.coroutine.html

我的意思是:try、catch finally 嵌套在协程中?我承认,我什至在几个例程中都遵循了这个建议,但我似乎并不正确。 Promises 和协程的全部意义在于摆脱丑陋的过度嵌套,回调已经创建了这些嵌套,现在呢?我们又来了?

如果有人知道如何将这种 bluebirdjs 错误混乱转变为更好的解决方案,我将不胜感激。

【问题讨论】:

  • Promise.coroutine == co.wrap。两者都返回返回具有catch 方法的承诺的函数。
  • @Bergi 愚蠢的我,你是对的。我试图在调用之前设置 catch 像这样 Promise.coroutine(/ generator stuff /).catch(handler) 而不是 Promise.coroutine(/ 生成器的东西 /).().catch(handler)

标签: javascript error-handling bluebird coroutine


【解决方案1】:

如果co 是蓝鸟Promise.coroutine,它将自动传播错误并记录未处理的拒绝。

记录未处理的错误。您可以处理以下错误:

Promise.coroutine(function*() { 
    try {
       doSomething();
       yield doSomethingAsync();
    } catch (e) {
       // handle error
    }
})();

【讨论】:

  • 当然,你的回答是对的。但问题是:它不应该是那样的。我的错误已经在 doSomethingAsync 中被捕获,那么协程中不应该有另一个 try/catch 块。
  • 对,它确实是这样工作的——你有什么不同的经历吗?
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多