【问题标题】:Promises and nodebacks- error in node back goes back to promise.catchPromise 和 nodebacks- 节点返回中的错误返回到 promise.catch
【发布时间】:2016-09-14 13:36:35
【问题描述】:

在仅使用回调后尝试将我的代码移动到 Promise 时, (不破坏函数的界面)我遇到了一个问题。 在这样的代码示例中:

function callMeWithCallback(args, next) {
    Promise.resolve()
     .then(()=> {
       return next("some error will be thrown here");
     }).catch((error)=> {
        return next("Error in callMeWithCallback func");
     });
 }

callMeWithCallback(args, function(){
     throw "some error";
})

在callMeWithCallback func中解析promise并调用一次回调后,会抛出错误,代码返回callMeWithCallback函数中的catch并再次调用回调。

我希望 callMeWithCallback 函数只回调一次(无论是否发生错误)我需要进行哪些更改?

【问题讨论】:

标签: javascript node.js promise


【解决方案1】:

我强烈建议您使用像 bluebird 这样的库来为您规范化 - 您的代码是:

function callMeWithCallback(args, next) {
  // in real code always reject with `Error` objects
  var p = Promise.reject("some error will be thrown here");
  p.asCallback(next); // converts a promise API to a callback one, `throw`s.
  return p;
}

这保证了“next”最多会被调用一次。

如果你不想要 bluebird,你可以自己实现:-

   function asCallback(promise, callback) {
     promise.then(v => callback(null, v), e => callback(e));
   }

只要您将电话放在一个地方就可以了。重要的部分是不要自己将呼叫分派给“下一个”。

【讨论】:

  • 感谢@benjamin。您在“重要的是不要自己将呼叫发送给下一个”中是什么意思。如果 asCallback 函数在一个地方调用它?
  • 是的,完全正确。抱歉,我很着急(还是有点忙),不想让你在没有答案的情况下悬而未决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多