promise和nodebbacks——nodeback中的错误会返回promise.catch

Promises and nodebacks- error in node back goes back to promise.catch

本文关键字:promise 误会 返回 catch 错误 nodebbacks nodeback      更新时间:2023-09-26

在尝试将我的代码移动到承诺后,只使用回调,(没有破坏函数的接口)我遇到了一个问题。在这样的代码示例中:

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函数中的承诺并调用回调一次后,抛出错误,代码返回callMeWithCallback函数中的catch并再次调用回调。

我希望函数callMeWithCallback只调用回调一次(无论是否发生错误)我需要暗示什么变化?

我强烈建议您使用像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));
   }
这将是好的,只要你保持调用在一个地方。重要的是不要把呼叫分派给"next"自己。