Javascript 重构:从值或现有承诺返回承诺 我的情景

Javascript 重构:从值或现有承诺返回承诺 我的情景,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,我以前使用回调完成了一些node.js实现,但现在我正在重构代码,改用承诺——使用Q模块。我有下面的update()函数,其中内部的\u update()函数已经返回了一个Promise: exports.update = function(id, template, callback) { if (!_isValid(template)){ return callback(new Error('Invalid data', Error.INVALID_DATA)); }

我以前使用
回调
完成了一些
node.js
实现,但现在我正在重构代码,改用
承诺
——使用
Q
模块。我有下面的
update()
函数,其中内部的
\u 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);
  });
};
我的问题 我希望实现以下目标:

因为
\u update()
已经返回了一个
承诺
,我想用这种方式更改它就足够了(不是吗?):

而且。。。如果
if子句中的
条件
等于
true
,该怎么办?我如何重构

返回回调(新错误('Invalid data',BaboonError.Invalid_data))

抛出
错误
以避免将
回调
传递到
update()
中并处理该错误(或者任何错误都可能返回
\u update()

另外,调用
update()

在我的代码中的其他地方:

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

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

我只看到两个问题

  • 如果您想要显式地返回一个带有值的被拒绝承诺,那么您应该使用

  • 呼唤承诺意味着承诺到此为止。它不能再被束缚了

  • 那么,您的代码将如下所示

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

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

    返回
    ???.done()
    不返回promise@JaromandaX是的,明白了!归还就够了<代码>完成()
    仅用于终止链。干杯是的,打电话的人应该这样做——在这种情况下,是我,所以我想确保这可以做到!顺便说一下,为了让事情更清楚:我们在这里使用
    Q.reject
    ,因为
    \u update()
    已经返回了一个承诺,因此使用
    延迟的
    s或
    新的Q.Promise
    s将使用一些承诺反模式,对吗?
      return _update(id, template)
      .done();
    
    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 */});
    
    exports.update = function (id, template) {
      if (!_isValid(template)) {
        return Q.reject(new Error('Invalid data', Error.INVALID_DATA));
      }
    
      return _update(id, template);
    };