簡體   English   中英

重構:從值或現有承諾中返回承諾

[英]Refactoring: returning a promise from a value or an existing promise

我的情況

我曾經使用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-clausecondition等於true怎么辦? 我該如何重構

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

拋出一個error以避免將callbackupdate()並處理該錯誤(或者曾經發生過什么錯誤可能返回_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. 在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功能始終總是返回一個承諾。 由調用者決定是否將成功或失敗處理程序附加到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM