gpt4 book ai didi

javascript - 重构 : returning a promise from a value or an existing promise

转载 作者:搜寻专家 更新时间:2023-11-01 00:41:13 25 4
gpt4 key购买 nike

我的场景

我曾经使用 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-clause 中的 condition 等于 true 怎么办?我该如何重构

return callback(new Error('无效数据', BaboonError.INVALID_DATA));

抛出一个error以避免将callback传递给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. 如果你想显式地返回一个被拒绝的 promise 和一个值,你应该使用 Q.reject 来实现。 .

  2. 调用 .done() on promise 意味着 promise 到此结束。它不能进一步链接。

所以,你的代码应该是这样的

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

return _update(id, template);
};

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

关于javascript - 重构 : returning a promise from a value or an existing promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33949435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com