【问题标题】:Q - Chaining Sync Promises to handle success and failureQ - Chaining Sync Promises 处理成功和失败
【发布时间】:2013-10-07 15:28:38
【问题描述】:

这应该很简单,我希望..

我知道如何做基本的承诺链:

main = function() {
  returnsAPromise().then(function(data1) {
    return augmentsAndReturnsTheData(data1);
  }).then(function(data2) {
    doesSomethingMeaningfulWithTheData(data2);
  });
};

但是,假设我想在最终处理可以处理成功和失败的数据之前添加某种拦截器,例如:

promisePrinter = function(promise) {
  var bad, good;

  good = function(data) {
    console.log(['Success', data]);
    return data;
  };
  bad = function(data) {
    console.log(['Failure', data]);
    return data;
  };
  return promise.then(good, bad);
};

如何将其包含在我的链中?尝试了几种不同的方法,但我似乎无法按预期调用 promisePrinter fn。

TIA!

【问题讨论】:

  • 您期待什么?承诺打印机(主());应该吐出成功或失败。
  • 我希望将 promisePrinter 添加到链中,而不是将承诺传递给它。这样我就可以将它粘贴到承诺流程中的任何地方
  • 您可以将每个阶段包装在 promisePrinter 中,即 { return promisePrinter(augmentsAndReturnsTheData(data1)); }
  • 或扩展 $.Deferred 以便它自动添加日志记录(覆盖或继承并制作您使用的自定义 $.LoggingDeferred)

标签: javascript promise q


【解决方案1】:

如 cmets 中所述,执行此操作的方法是 promisePrinter(main()),如果您想将其放在给定步骤中,则为 return promisePrinter(augmentsAndReturnsTheData(data1))。在 Promise 原型上没有执行此操作的特殊方法,例如 thencatchfinally,因为您在这里进行了非常独特的操作:

  • 如果 promise 实现(异步返回),则记录成功,然后 return 传递。
  • 如果 promise 被拒绝(异步抛出),您将记录错误,然后 return 从该错误中恢复。 (如果你想继续传递错​​误,你会重新抛出它。)

现有的finally 是您想要的,但并不真正适合,因为它会继续传递错​​误(如同步finally)并且不接受值或错误(如同步finally )。

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 2021-08-07
    • 2016-11-05
    • 2016-05-26
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多