【问题标题】:Refactoring: returning a promise from a value or an existing promise重构:从一个值或一个现有的 Promise 中返回一个 Promise
【发布时间】:2015-11-27 10:27:43
【问题描述】:

我的场景

我曾经使用callbacks 完成了一些node.js 实现,但我现在正在重构我的代码以使用Promises 代替-使用Q 模块。我有以下update() 函数,其中内部_update() 函数已经返回Promise

exports.update = function(id, template, callback) {
  if (!_isValid(template)){
    return callback(new Error('Invalid data', Error.INVALID_DATA));
  }

  _update(id, template) // this already returns a promise
  .then(function() {
    console.log('UPDATE was OK!');
    callback();
  }, function(err) {
    console.log('UPDATE with ERRORs!');
    callback(err);
  });
};

我的问题

我想实现如下

exports.update = function(id, template) {
  if (!_isValid(template)){
    // how could I make it return a valid Promise Error?
    return reject(new Error('Invalid data', Error.INVALID_DATA));
  }

  return _update(id, template) // return the promise
  .done();
};

因为_update() 已经返回promise,我想这样改变就足够了(不会吧?):

  return _update(id, template)
  .done();

而且...如果if-clause 中的condition 等于true 呢?我该如何重构

return callback(new Error('Invalid data', BaboonError.INVALID_DATA));

抛出一个error 以避免将callback 传递给update() 并处理该错误(或者任何错误都可能返回_update())?

另外,拨打update()

myModule.update(someId, someTemplate)
.then(function() { /* if the promise returned ok, let's do something */ })
.catch(function(err) { /* wish to handle errors here if there was any */});

我的代码中的其他地方:

  • 如果promise 传播过程中出现错误 - 它应该处理它,
  • 或者,如果没有错误 - 它应该做一些其他的事情

我是否接近我的预期?我怎么能最终实现它?

【问题讨论】:

  • 返回???.done() 确实返回一个承诺
  • @JaromandaX 是的,明白了!退货就够了。 done() 仅用于终止链。干杯!

标签: javascript node.js promise q


【解决方案1】:

我只看到两个问题。

  1. 如果您想显式返回带有值的被拒绝的承诺,您应该使用Q.reject

  2. 在 promise 上调用 .done() 意味着 promise 到此结束。它不能被进一步链接。

所以,你的代码应该是这样的

exports.update = function (id, template) {
  if (!_isValid(template)) {
    return Q.reject(new Error('Invalid data', Error.INVALID_DATA));
  }

  return _update(id, template);
};

现在,update 函数总是返回一个承诺。由调用者将成功或失败处理程序附加到它。

【讨论】:

  • 是的,调用者应该这样做 - 在这种情况下,它将是我,所以我想确保它可以完成!顺便说一下,为了让事情更清楚:我们在这里使用Q.reject,因为_update() 已经返回了一个Promise,因此使用deferreds 或new Q.Promises 将使用一些Promise 反模式,对吗?
猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多