我很难用Promise.all处理错误:
return Promise.all([
this.pagination(),
this.prepareParams(this.params, this.requestData),
this.fetchRecipes(this.apiData, this.params)
])
.catch(e => console.log());
首先,我只是试图在this.pagination()
中抛出一个异常,它甚至被处理了,但奇怪的是,下一个Promise尽管被执行了。
pagination(): Promise<any> {
return new Promise(resolve => {
if(...) {
...
resolve();
} else {
...
throw "no more results";
}
}
然后我尝试使用Promise.reject("no more results")
代替,但问题是它现在忽略了catch
未捕(承诺):没有更多结果
为了澄清其他人:我的初衷是为了防止执行下一个2 Promise,如果第一个被拒绝的话。我错误地认为Promise.all
符合这个要求。感谢traktor53的回答,我意识到链接承诺是一个更好的解决方案。
答案 0 :(得分:2)
Promise.all
在返回结果数组之前等待其参数数组中的所有promise都得到满足,但是一旦任何的promises中的任何,它将拒绝它返回的promise。数组被拒绝(“快速拒绝”)。
Promise.all
就所传递的每一笔承诺调用then
以获取其履行的价值或拒绝的理由。 如果其中一个被拒绝,它不会试图中止其他承诺 - Promise标准中没有机制可以取消承诺的操作。
如果您希望仅在前一个承诺成功后继续执行承诺操作,请使用链接而不是promise.all
,注意承诺回调中this
值是否正确(例如,使用箭头功能):
function objectMethod () {
return this.pagination()
.then( data=>this.prepareParams(this.params, this.requestData))
.then( data=>this.fetchRecipes(this.apiData, this.params));
}
// catch errors encountered during call:
someObject.someMethod().catch(e => console.log(e));
答案 1 :(得分:0)
callback parameter to the Promise
constructor (MDN)有两个参数,名为resolve
和reject
,后者是你遗漏的。您必须将其传递给reject
,而不是抛出错误。因此:
pagination(): Promise<any> {
return new Promise((resolve, reject) => {
if(...) {
...
resolve();
} else {
...
reject("no more results");
}
}
答案 2 :(得分:0)
最好添加 try - 在调用函数时捕获块
其他
pagination(): Promise<any> {
return new Promise((resolve, reject) => {
if(...) {
...
resolve();
} else {
...
reject("no more results");
}
}
在你的函数调用中。
pagination().then(err, value) {}