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

2023-12-13

我的场景

我曾经有一些node.js实施完成使用callbacks但我现在正在重构我的代码以使用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();
};

Because _update()已经返回一个promise,我想这样改变它就足够了(不是吗?):

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

而且...如果condition在 - 的里面if-clause equals true?我该如何重构

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

扔一个error以避免通过callback into 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. Calling .done()on Promise 意味着承诺到此结束。它不能被进一步束缚。

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

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

  return _update(id, template);
};

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重构:从值或现有承诺返回承诺 的相关文章

随机推荐