Javascript 混淆错误,拒绝承诺
全部: 我对JS Promise很陌生,在Promise链接方面有一个困惑,比如我有一个Promise链接: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){
var p = new Promise(function(res, rej){
})
.then(
function(data){
},
function(err){
})
.then(
function(data){
},
function(err){
})
.catch(
function(err){
})
让我困惑的是:
中解决和拒绝问题,然后
感谢需要知道的重要一点是.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
处理程序/侦听器/回调(取决于您的术语)
的第一个参数提供的侦听器将使用解析值调用
的第二个参数提供的侦听器。然后使用拒绝的值调用或.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()中的第一个函数将被调用