【问题标题】:Linting Promises in Javascript在 Javascript 中检查 Promise
【发布时间】:2015-06-29 08:07:00
【问题描述】:

我希望在我的团队的代码库中标准化 Q Promise 的使用。是否有任何好的 jscs 扩展(或其他 linter)来帮助在 Promise 方面强制执行样式?

我们希望我们的承诺遵循这种形式:

promise()
  .then()
  .catch()
  .done();

并且希望 linter 能够捕获我们代码中缺少 .catch() 的任何 .then()

也欢迎在承诺方面提供其他风格提示的建议。

【问题讨论】:

  • 任何代码中的大多数thens 后面都不应该跟catch,因为你的函数中的return 承诺。您只会在 Promise 链的末尾使用这种模式(如果有的话),我想这对于简单的样式检查器来说很难跟踪。
  • 详细阐述 Bergi 所说的 - .then() 必须拥有 .catch.done 就像让每个函数都包装在 try/catch 中或让每个函数都没有返回值明确地说。在我看来,如果您想要更好的调试,请尝试 bluebird promises 而不是 Q,它们放弃了对 .done 的要求以显示异常并且它们的性能也更好。 基本上,这是 Qs 让你这样做的错误,你可以通过现代图书馆避免它
  • 另外,这是题外话(图书馆请求),但github.com/spion/thenlint
  • @BenjaminGruenbaum 谢谢你的建议!对每个.then 调用强制执行.catch 的原因是我们有异常被.then 吞噬,而catch 似乎是解决它的方法。例如,在返回 deferred.promise 的函数中:function() { var def = Q.defer(); promise.then(function(result){ // do something to modify result def.resolve(result); }) .catch(function(err) { def.reject(err); }) return def.promise(); } 使用 .done 或 BlueBird 中的其他东西会更好地处理吗?
  • @Jeff 这只是因为您使用的是 ancient 库、本机承诺(在 io.js 中)、RSVP 承诺,当承诺和蓝鸟承诺都为您提供工具时来处理这个问题。 Bluebird 在处理它方面是最好的(它也比 Q 快 100 倍,具有更好的堆栈跟踪和更丰富的 API)

标签: javascript coding-style promise q jscs


【解决方案1】:

@Jeff 这种方法看起来完全是矫枉过正。任何一个都不能跟在这两个函数后面。他们每个人都有不同的目的:

  • 当您想要处理已解析的值时使用then(mapSuccess, mapFail)并且您需要一个将使用回调返回的值解析的结果承诺
    从技术上讲,它是价值到其他价值的映射,将由其他承诺解决。您可能会认为它类似于数组的map,您可以将输入数组映射到其他数组,这是某些转换函数的结果。
  • catch(mapFail) 纯粹是then(null, mapFail) 的别名,所以当你想then 时使用它,但你不需要传递 mapSuccess 回调。
  • done(onSuccess, onFail) 使用简单,当您只想处理已解析的值时(无需映射到其他承诺)。 done 还将确保所有最终错误都会自然暴露(thencatch 因为它们是映射器,所以会将错误吞入 promise 结果中)。

我可以想象只有一条规则可以为 linter 添加(并且假设您使用不记录吞下异常的库)。当 then()catch() 的结果被忽略时,它会警告它们的用法(它们后面应该跟 done(..) 或传递给其他实体进行处理)。

【讨论】:

  • 我们决定使用.then.catch,因为我们发现它比then(onSuccess, onFail)更具可读性。但是您所做的评论很有趣,因为我们想实现这种 linting 主要是为了避免被吞没的错误。在我对本杰明原始问题的评论中,如果我们想避免误吞,.done 是否比.then 更合适?
  • 我将参数名称用于更好地描述每个方法的作用,并表明.catch.then 并没有真正的不同。我现在还更新了它们,以区分 .then.done :)
  • @Jeff: 但是那些符号are not equivalent?!
  • 确实,.then(onSuccess,onError).then(onSuccess).catch(onError) 不同。前者不会捕获 onSuccess 方法内部发生的错误。 98% 的时间前者是反模式。
猜你喜欢
  • 2018-06-17
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多