【问题标题】:Bluebird Promises and Domains蓝鸟承诺和领域
【发布时间】:2016-07-26 17:33:40
【问题描述】:

我遇到了在 bluebird promise 中抛出错误的问题。取以下代码:

var Promise = require('bluebird');
var domain = require('domain');

var problem = function() {
    return new Promise(function(resolve, reject){
        reject(new Error('Oops!'));
    });
};

domain.create()
    .on('error', function(e){
        console.log("Caught Error " + e.message)
        process.exit(1);
    })
    .run(function() {
        problem().done();
    });

我希望在控制台中看到Caught Error Oops!。但是,似乎该错误未在域内捕获,并且我在控制台中看到了致命错误和堆栈跟踪。

有人知道为什么吗?

【问题讨论】:

  • 域已弃用,您不应使用它们。
  • 这不是很有帮助。是的,我知道域名将来可能会被替换,但是在要求弃用它们近 2 年后的今天,它们仍然是核心。域仍在等待弃用,因为尚未实现任何东西来取代它们提供的非常具体的功能。
  • 这是 bluebird 的问题,Q 库函数的承诺符合预期。
  • 不要混合使用两种技术。承诺和域可以处理您的错误,但您应该选择其中之一。您看不到错误消息,因为 bluebird 会为您处理它。当 Promise 链中出现任何错误或您因错误拒绝时,您可以在catch 处理程序中捕获错误并在那里处理错误。

标签: javascript node.js promise bluebird node.js-domains


【解决方案1】:

这个异常实际上是由 Bluebird 处理的。承诺拒绝与未处理的异常不同。相反,如果您在 setTimeout 中创建一个真正的未处理异常,因此 Bluebird 不会处理它,因为它会在不同的堆栈上,您的域将按预期工作。

var Promise = require('bluebird');
var domain = require('domain');

var problem = function() {
    return new Promise(function(resolve, reject){
        setTimeout(function() {
            throw new Error('boom!');
        }, 1)

    });
};

domain.create()
    .on('error', function(e){
        console.log("Caught Error " + e.message)
        process.exit(1);
    })
    .run(function() {
        problem().done();
    });

【讨论】:

  • 好答案。使用 process.nextTick 无疑会更好?
  • process.nextTick 可能会工作/更好,我忘记了 setTimeout 和 nextTick 之间的细微差别
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2014-11-06
  • 2015-09-06
  • 2015-02-13
相关资源
最近更新 更多