Javascript 混淆错误,拒绝承诺

Javascript 混淆错误,拒绝承诺,javascript,promise,Javascript,Promise,全部: 我对JS Promise很陌生,在Promise链接方面有一个困惑,比如我有一个Promise链接: var p = new Promise(function(res, rej){ }) .then( function(data){ }, function(err){ }) .then( function(data){ }, function(err){ }) .catch( function(err){

全部:

我对JS Promise很陌生,在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()方法总是链接到一个承诺上,它返回一个新的承诺,其值和已解析/已拒绝状态取决于给定给它的函数返回的内容

    在您的示例中,如果原始承诺已解析,则first.then()中的第一个函数将使用已解析的值进行调用。如果它返回一个值,那么它返回的任何值都将最终传递到第二个函数中的第一个函数中。然后()。catch中的函数永远不会被调用

    如果Promise拒绝,那么将使用拒绝的值调用first.then()中的第二个函数,它返回的任何值都将成为一个新的已解析Promise,并传递到第二个函数的第一个函数中。这里也不叫Catch。只有当承诺被拒绝,并且您在
    函数(err){}
    函数中不断返回被拒绝的承诺或抛出错误时,才会在catch块中调用
    函数(err){}

    要在
    函数(数据){}
    函数中进行解析,只需返回一个值(或返回一个稍后解析的承诺/表)。 要拒绝,您需要抛出错误、实际导致错误、返回最终拒绝的新承诺,或者显式返回
    Promise.reject(::某些值:)

    要在
    函数(err){}
    块中解析,只需返回一个新值。您还可以返回一个承诺,在这种情况下,该承诺将被返回(最终解决或拒绝)

    一般来说,在同一个.then()中同时定义已解析路径和已拒绝路径是不明智的:
    PROMISE.then(fn).catch(fn)
    是一种更安全、更清晰的做法,因为第一个.then()中的任何错误都会被catch捕获。如果你答应了,那么(fn,fn)相反,如果第一个函数中发生错误,第二个函数就不会捕捉到它:一些后来链接的方法必须捕捉到它

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

    var p=newpromise(函数(res,rej){})

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

  • 当使用允诺对象(或任何具有
    属性的对象)解析允诺时,在解析中提供的允诺对象本身变得满足被拒绝之前,不会发生任何事情。满足的值传递给
    。然后
    oncompleted
    处理程序,拒绝的值传递给
    。然后
    onRejected
    处理程序/侦听器/回调(取决于您的术语)

  • 但是,当使用非承诺(like)对象解析承诺时,作为
    的第一个参数提供的侦听器将使用解析值调用

  • 当使用任何值拒绝承诺时,作为
    的第二个参数提供的侦听器。然后使用拒绝的值调用
    .catch
    的第一个参数

  • .catch
    是一种委婉说法,用于调用
    。然后使用提供的参数作为第二个参数,省略第一个参数,如中所示

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

  • .then
    注册的
    onFulfill
    onReject
    函数的行为是相同的。拒绝连锁承诺会引发错误。要实现链接承诺,请返回非承诺值。若要保留链接承诺,请返回承诺(或类似承诺)对象


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

    function onFulfill( data) { return data;}
    function onReject( err) { throw err;}
    
    使用单个参数调用
    then
    catch
    时通常会出现这种情况


  • 使用承诺的公式是:

    var p=新承诺(函数(解析、拒绝){
    var条件=剂量测量();
    如果(条件){
    解析(数据);
    }否则{
    拒绝(错误);
    }
    });
    
    关于
    .catch
    没有什么特别之处,它只是
    的糖。然后(未定义,func)
    ,但是
    。catch
    更清楚地表明它纯粹是一个错误处理程序

    如果一个
    承诺
    没有解决,并且其中没有提供拒绝回调,那么它会向前跳到下一个
    。然后在包含拒绝回调的链中进行
    。拒绝回调是
    拒绝(err)

    有关更多详细说明,请参阅:


    也就是说:在您的示例中,
    catch
    只有在前面的拒绝回调中有错误时才会被调用。也就是说,
    reject(err)
    函数本身有一个错误-这与前面的
    Promise
    未解析无关


    基本上,您可以将自己限制为
    链末端的
    catch
    中的拒绝回调。任何
    中的任何
    错误
    。然后
    将落入
    陷阱
    。不过有一个微妙之处:没有捕捉到
    .catch
    中的任何错误。

    “如果承诺得到解决,那么first.then()中的第一个函数将被调用