【问题标题】:Error is not thrown inside a deferred method错误不会在延迟方法中引发
【发布时间】:2015-06-22 23:23:40
【问题描述】:

有人可以向我解释为什么我的第一个示例中没有抛出我的错误吗?当我使用process.nextTick() 时为什么会这样?

var deferred = require('deferred');

// This code does not work. 
// Error seems to never been thrown and script kind of freeze without saying anything.
deferred.resolve().then(function(){
    console.log('deferred resolved');
    throw new Error('Synchronous error thrown in deferred.then()');
});

// This code does work. 
// I just embedded the throw in the process.nextTick() method.
deferred.resolve().then(function(){
    console.log('deferred resolved');
    process.nextTick(function(){
        throw new Error('Synchronous error thrown in deferred.then()');
    });
});

为什么我需要等待 nextTick 在then() 内抛出错误...

任何解释将不胜感激。 谢谢

我看过这篇文章 (No errors thrown/displayed when in a deferred callback)。但它只给出了一半的答案......

【问题讨论】:

    标签: node.js exception-handling deferred


    【解决方案1】:

    在你的情况下,deferred 的行为在我看来是合理的。

    在第二种情况下,我认为deferred 没有办法捕获nextTick 回调中抛出的错误。于是报错了。

    在第一种情况下,deferred 捕获它并认为导致的承诺处于失败状态。 deferred 文档指出,如果你希望它有效地抛出一个将 Promise 推入失败状态的错误,你必须调用 done

    deferred.resolve().then(function(){
      console.log('deferred resolved');
      throw new Error('Synchronous error thrown in deferred.then()');
    }).done();
    

    有关文档,请参阅 https://github.com/medikoo/deferred#ending-chain

    【讨论】:

    • 谢谢。这就是我在询问后所理解的(至少对于第一个案例的连锁结局)。我猜你对process.nextTick() 的看法是正确的:它可能应该将内部函数从延迟的工作流程中取出,然后它不会捕获错误。感谢您证实了我的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2020-01-16
    • 2015-09-13
    相关资源
    最近更新 更多