gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:18:40 26 4
gpt4 key购买 nike

我正在使用在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com