繁体   English   中英

在Promise中混淆错误和拒绝

[英]Confuse about error and reject in Promise

所有:

我对JS Promise很陌生,在Promise链接方面有一个令人困惑的地方,比如说我有一个像以下链接的承诺:

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

让我困惑的是:

  1. 当调用函数(错误)和调用catch时?
  2. 如何解决并拒绝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 Promises - There and Back


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

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

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

在您的示例中,如果原始Promise结算,则第一个.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).catch(fn)是一种更安全/更清晰的做法,因为那时第一个中的任何错误。然后()将被catch抓住。 相反,如果你做了PROMISE.then(fn, fn) ,如果在第一个函数中发生错误,它就不会被第二个函数捕获:一些后来链接的方法必须捕获它。

  1. 请注意示例执行程序函数

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

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

  2. 当使用Promise对象(或具有.then属性的任何对象是函数)解析promise时,在解析本身提供的promise对象变为满足拒绝之前,不会发生任何事情。 达到的值传递给.then onFulfilled处理,拒绝值传递到.then onRejected处理器/监听器/回调(取决于您的术语)。

  3. 但是当使用非promise(如)对象解析promise时.then将使用分辨率值调用作为.then的第一个参数提供的侦听器。

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

  5. .catch是调用.catch的委婉说法.then使用提供的参数作为第二个参数并省略第一个参数,如

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

  6. 的行为.then注册onFulfillonReject功能是一样的。 拒绝链式承诺会引发错误。 履行链式承诺会返回非承诺值。 持有链式承诺会返回一个承诺(或承诺)对象。


  7. (更新)当提供给.then( onFulfill, onReject)的参数缺失或不是函数对象时,处理相当于从以下位置提供虚函数:

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

    这是调用thencatch单个参数时的常见情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM