在Promise中混淆错误并拒绝

所有:

我对JS Promise非常陌生,当谈到Promise链接时有一种混淆,说我有一个承诺链接如下:

var p = new Promise(function(res, rej){
})
.then(
    function(data){
    }, 
    function(err){
    })
.then(
    function(data){
    }, 
    function(err){
    })
.catch(
    function(err){
    })

什么使我困惑:

  • 当函数(err)被调用并且catch被调用时?
  • 如何解决并拒绝then
  • 谢谢


    使用Promise的公式是:

    var p = new Promise(function(resolve, reject) {
    
      var condition = doSomething();
    
      if (condition) {
        resolve(data);
      } else {
        reject(err);
      }
    
    });
    

    .catch没有什么特别之处,它只是.catch .then (undefined, func)糖,但.catch更清楚地表明它纯粹是一个错误处理程序。

    如果Promise未解决且未提供拒绝回叫,则会跳到下一个.then在链中拒绝回拨。 拒绝回拨是reject(err)

    有关更详细的解释,请参阅:JavaScript承诺 - 在那里并返回。


    那就是:在你的例子中。 如果前面的拒绝回调在其中有错误,则只catch被调用者。 这就是reject(err)函数本身存在错误 - 这与前面的Promise无关,无法解决。

    你基本上可以把自己局限在一个拒绝回调.catch在您结束的.then链。 任何Error在任何.then再将始终陷入.catch 。 尽管有一点微妙之处: .catch任何错误都未被捕获。


    重要的是要知道.then()方法总是链接到一个Promise上,并且它返回一个新的Promise,它的值和解析/拒绝状态是基于赋给它的函数返回的。

    在你的例子中,如果最初的Promise解析了,那么你的第一个.then()中的第一个函数将被解析的值调用。 如果它返回一个值,那么它返回的任何值将最终传递到第二个.then()中的第一个函数中。 catch中的函数永远不会被调用。

    如果Promise拒绝,你的第一个.then()中的第二个函数将被拒绝的值调用,并且它返回的任何值将成为一个新的已解决的Promise,它将传递到你的第二个函数中。 Catch从来不会在这里被调用。 只有Promise拒绝,并且您在function(err){}函数中一直返回被拒绝的Promises或抛出错误,才会在您的catch块中调用function(err){}

    要解决你的function(data){}函数,你需要做的就是返回一个值(或者返回一个Promise / thenable,稍后解析)。 要拒绝,您需要抛出一个错误,实际上会导致错误,返回最终拒绝的新Promise,或者显式返回Promise.reject(::some value::)

    要解决你的function(err){}块,你需要做的就是返回一个新的值。 你也可以返回一个Promise,在这种情况下,Promise将被返回(最终解决或拒绝)。

    一般来说,在相同的PROMISE.then(fn).catch(fn)定义解析和拒绝的路径并不明智, PROMISE.then(fn).catch(fn)是更安全/更清晰的练习,因为之后的任何错误。那么()将被捕获。 如果你做了PROMISE.then(fn, fn)但是如果在第一个函数中发生了错误,它不会被第二个函数捕获:稍后一些方法中的链接必须捕获它。


  • 请注意例子中的执行器函数

    var p = new Promise(function(res, rej){});

    不完整。 提供给Promise构造函数的实际执行函数必须调用它的第一个参数( res )来解析构造的promise,或者第二个参数rej来拒绝promise。 这些调用通常是异步的,但不一定要在ES6中。

  • 使用Promise对象(或具有.then属性的函数的任何对象)解决承诺时,只有在.then提供的承诺对象被满足拒绝后,才会发生任何事情。 达到的值传递给.then onFulfilled处理,拒绝值传递到.then onRejected处理器/监听器/回调(取决于您的术语)。

  • 但是当一个promise被一个非promise(like)对象解析时,作为第一个参数提供给.then监听器被调用了分辨率值。

  • 当一个承诺与任何值拒绝,听众提供作为第二个参数来.then ,或者第一参数.catch ,被称为与被拒绝的值。

  • .catch是调用的委婉语.then将提供的参数作为第二个参数并省略第一个参数,如

    Promise.prototype.catch = function( listener) { return this.then(null, listener);};

  • 的行为.then注册onFulfillonReject功能是一样的。 拒绝链接承诺会抛出错误。 为了履行链接的承诺,返回一个非承诺价值。 坚持链接承诺返回承诺(或诺言)对象。


  • (更新)当提供给.then( onFulfill, onReject)的参数缺失或不是函数对象时,处理等同于从以下项提供虚拟函数:

    function onFulfill( data) { return data;}
    function onReject( err) { throw err;}
    

    这是调用时,通常情况下thencatch有一个参数。

  • 链接地址: http://www.djcxy.com/p/55503.html

    上一篇: Confuse about error and reject in Promise

    下一篇: Passing (object.function) as a parameter