编程语言
首页 > 编程语言> > javascript-重构:从值或现有的承诺中返回承诺

javascript-重构:从值或现有的承诺中返回承诺

作者:互联网

我的情况

我曾经使用回调完成一些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子句中的条件等于真该怎么办?我该如何重构

返回回调(新错误(‘无效数据’,BaboonError.INVALID_DATA));

抛出一个错误以避免将回调传递到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 */});

我代码中的其他地方:

>如果在承诺传播期间出现错误-应该处理该错误,
>或者,如果没有错误-它应该做一些其他事情

我是否接近预期?我最终将如何实现?

解决方法:

我只看到两个问题.

>如果要显式返回带有值的已拒绝承诺,则应使用Q.reject.
>对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);
};

现在,更新功能始终总是返回一个承诺.由调用者决定是否将成功或失败处理程序附加到它.

标签:q,javascript,node-js,promise
来源: https://codeday.me/bug/20191011/1890843.html