重构:从值或现有承诺返回承诺



我的场景

我曾经使用 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传播过程中出现错误 - 它应该处理它,
  • 或者,如果没有错误 - 它应该做一些其他事情

接近我所期望的吗?我怎样才能最终实现它?

我只看到两个问题。

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

  2. 呼召.done()承诺意味着承诺到此结束。它不能进一步链接。

所以,你的代码看起来像这样

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

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

相关内容

  • 没有找到相关文章

最新更新