首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构:从价值或现有承诺中返回承诺

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

Stack Overflow用户
提问于 2015-11-27 02:21:18
回答 1查看 351关注 0票数 2

我的情景

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

代码语言:javascript
复制
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);
  });
};

我的问题

我想实现以下几点:

代码语言:javascript
复制
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,所以我想这样修改它就足够了(不是吗?):

代码语言:javascript
复制
  return _update(id, template)
  .done();

还有..。如果condition中的if-clause等于true呢?我怎么能重构

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

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

同时,调用update()

代码语言:javascript
复制
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传播过程中有错误-它应该处理它,
  • 或者,如果没有错误-它应该做一些其他的事情

我是否接近我所期望的?我怎么能最终做到这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-27 02:27:43

我只看到两个问题。

  1. 如果您想显式地返回一个被拒绝的承诺值,您应该使用Q.reject
  2. 按承诺调用.done()意味着承诺在那里结束。不能再把它拴在一起了。

所以,您的代码应该如下所示

代码语言:javascript
复制
exports.update = function (id, template) {
  if (!_isValid(template)) {
    return Q.reject(new Error('Invalid data', Error.INVALID_DATA));
  }

  return _update(id, template);
};

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33949435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档