javascript - node.js Q Promise 不会通过拒绝处理程序传播异常

标签 javascript node.js promise q

我正在使用requestify发出一些 HTTP 请求。该模块内部使用了其他模块,例如 HTTP、socket 等。它还使用了 Q Promise。

requestify使用的模块可以异步抛出异常(例如socket模块可以抛出ECONNREFUSED)。每当抛出异常时,控制流就会脱离进程的通用未捕获异常处理程序,并且不会传播到 Promise 的错误/拒绝处理程序。

下面的代码是示例代码,它代表了问题。

问题 - 我是否可以通过 Q Promise 的拒绝处理程序来处理此类异常?

// sample code
var _inspect = require('util').inspect;
var _q = require('q');

function handle_uncaught_exception(ex) {
  console.log(" Uncaught Exception: " + _inspect(ex));
  process.exit(2);
}
process.on('uncaughtException', handle_uncaught_exception);

function foo_3rd_party_code() {
  var d = _q.defer();
  setTimeout(
    function () {
      throw new Error("TEST_EXCEPTION");
    },
    1000
  );
  return d.promise;
}

foo_3rd_party_code()
  .then(
    function (val) {
      console.log("Promise Fullfilled: " + _inspect(val));
      process.exit(0);
    },
    function (err) {
      // it would be nice to see the TEST_EXCEPTION here.
      console.log("Promise Rejected: " + _inspect(err));
      process.exit(1);
    }
  );

最佳答案

foo_3rd_party_code 无法捕获或处理异常,因为它看不到它。为此,您必须使用 Promise 的 reject 方法。

function foo_3rd_party_code() {
  var d = _q.defer();
  setTimeout(
    function () {
      d.reject(new Error("TEST_EXCEPTION"));
    },
    1000
  );
  return d.promise;
}

关于javascript - node.js Q Promise 不会通过拒绝处理程序传播异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33408575/

相关文章:

javascript - CoffeeScript转换尝试/捕获/最终在使用功能引用时奇怪地阻止

javascript - 使用 Promises 时卡在变量上的最佳实践

javascript - 谷歌地图 react |不会渲染,一直在加载

mysql - 在不共享 URL 的情况下获取正确的 ID

javascript - NodeJS什么时候选择同步计算延迟太大?

javascript - 无法从 $http promise 和 then() 代码中获取值未执行

javascript - 如何将数组的对象元素数量存储在另一个数组中?

javascript - Javascript 不支持参数多态性(通用编程)?

javascript - flutter inappwebview 未在控制台上打印

node.js - npm 从私有(private)注册表安装,回退到 git 存储库 URL