javascript - 'LOUD' 错误的可接受 promise 模式?

标签 javascript ember.js promise rsvp.js

我正在使用在 Ember.js 中分发的 RSVP 库,我正在尝试找出在 promise 中报告 fatal error 的正确模式——特别是我想通知一些几乎肯定是编程结果的事情由于 api 滥用而导致的错误,我想以大声的方式进行。一般来说,我是 promises 和 javascript 的新手,希望这个问题有意义

这是一个简单的例子(在 coffeescript 中):

doAsync = (arg, callback) ->
  throw new Error('you gave me a way bad arg, I fail for you!')

promiseReturningApi = (data) ->
  return new Ember.RSVP.Promise (resolve, reject) ->
    callback = (err, resp) ->
      if err then reject(err)
      else resolve(resp)
    doAsync(data, callback)

现在假设我已经识别出一个无法从中恢复的错误,该错误发生在 doAsync 内部——我想确保报告此错误,即使调用者忽略了附加错误处理程序,因为它几乎肯定只是导致调用者以不正确的方式调用了 api 函数

我想到了在拒绝处理程序中使用 setTimeout 的想法,以确保从某处 引发错误,即使调用者没有将错误处理程序附加到 promise

failLoud = (err) ->
  if err.isProgrammerError
    setTimeout () ->
      throw err
  throw err

promiseReturningApi = (data) ->
  promise = new Ember.RSVP.Promise (resolve, reject) ->
    callback = (err, resp) ->
      if(err) then reject(err)
      else resolve(resp)
    doAsync(data, callback)
  return promise.then(null, failLoud)

在从我的 promiseReturningApi 返回之前,将这样一个默认错误处理程序附加到一个 promise 是否被认为是一种合理的做法?这将允许我在调用者做一些不可能工作的事情时强制执行堆栈跟踪——即使堆栈跟踪会有点奇怪,但它可以使事情更容易开始……

即使我将示例 promise 返回函数称为“api”调用——我应该补充一点,我不是在编写框架代码——这完全是在一个应用程序中。如果 doAsync 是一个真实世界的函数,那么在我的真实世界版本中,它很可能来自一个对我来说是新的 api 的外部方——所以我很可能会滥用它我正在了解它......意思是我可能想要将模式制作成这样

failLoud = (err) ->
  if err?.isProgrammerError
    setTimeout () ->
      throw err
  throw err

promiseReturningApi = (data) ->
  promise = new Ember.RSVP.Promise (resolve, reject) ->
    callback = (err, resp) ->
      if(err) reject(err)
      resolve(resp)
    try
      doAsync(data, callback)
    catch err
      err.isProgrammerError = true
      throw err
   return promise.then(null, failLoud)

我认为这样做是在我的异步函数调用本身引发异常时强制从某处抛出异常——这样的异常几乎肯定会在参数中引发异步调用的验证阶段最常见的结果是我的应用程序代码传递了一些没有任何意义的东西——我想尽快找到它。这似乎是一种合理的模式,可以帮助调试在此上下文中应用程序代码中使用的 promise ?

最佳答案

新答案--

在这个与 ember 核心开发人员的视频小组讨论中,开发人员有一次分享了一个调试技巧:

http://www.youtube.com/watch?v=L9OOMygo1HI

Tom Dale 特别解决了 promises 中吞噬异常的问题,并建议使用新的 Ember.RSVP.onerror 功能来调试 promises 中的错误,否则这些错误将不会被报告,因为没有附加拒绝处理程序。

我认为这是对我的问题的正确答案——尽管我还不知道如何使用 RSVP.onerror 回调(或者 ember 在其中发布它的可用回调)...

关于javascript - 'LOUD' 错误的可接受 promise 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17866672/

相关文章:

javascript - 从模块导入多个函数而不显式导出对象或命名导出

javascript - 如何解析 promise 并监视 axios 中的函数

javascript - 使用 jQuery 获取选择列表每次更改的值

javascript - jQuery 颜色替换有时有效,有时无效

ember.js - 断言失败: You need to pass a model name to the store's modelFor method

templates - Ember model.get() 未正确返回值或绑定(bind)到模板

javascript - 如何在 PhoneGap 中显示长数据列表

javascript - 将文本与可折叠集 jquery 移动中的按钮对齐

javascript - Angular2组件变量被多个promise修改

javascript - "A promise was created in a handler but was not returned from it"