在Promise中混淆错误并拒绝
所有:
我对JS Promise非常陌生,当谈到Promise链接时有一种混淆,说我有一个承诺链接如下:
var p = new Promise(function(res, rej){
})
.then(
function(data){
},
function(err){
})
.then(
function(data){
},
function(err){
})
.catch(
function(err){
})
什么使我困惑:
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
注册onFulfill
和onReject
功能是一样的。 拒绝链接承诺会抛出错误。 为了履行链接的承诺,返回一个非承诺价值。 坚持链接承诺返回承诺(或诺言)对象。
(更新)当提供给.then( onFulfill, onReject)
的参数缺失或不是函数对象时,处理等同于从以下项提供虚拟函数:
function onFulfill( data) { return data;}
function onReject( err) { throw err;}
这是调用时,通常情况下then
或catch
有一个参数。