我查看了其他stackoverflow的答案,似乎无法找到答案。
实际上,我正在编写一个验证某些数据的模块,然后如果没有错误则将其传递给第三方api。
我的问题是,如果Promise.all拒绝,那么我的初始呼叫承诺仍然会转移到下一个。
------my main app---------
const data = [1,0,1]
api.sendData(data)
.then( () => {
*ALWAYS HITTING THIS*
})
.catch(err => console.log(err))
---------the api---------
return await a.test(data).then(rd => {
return rd
})
.catch(ed => {
return ed
});
-----a.test function--------
let request = data.map((i) => {
return new Promise((resolve, reject) => {
if(i < 1) {
reject('value to low')
}
resolve(i);
});
});
return await Promise.all(data)
});
有人能告诉我为什么我的主要应用程序中没有发现我的捕获? 上面的代码是伪的,但描述了问题。
答案 0 :(得分:3)
我认为问题来自于您在api函数中捕获错误的事实以及catch method return a new promise(在您有效返回值时实现)
因此,如果您没有发现错误,则应该修复您的问题,因为错误将被转发
return a.test(data).then(rd => {
// do some stuffs ...
return rd;
})
// no catch
答案 1 :(得分:2)
你可能有一个错字。 如上所述,您尝试Promise.all()一个整数数组,它们都将解析。
您应该返回 ###data-service.service.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
import {DataServiceService} from '../shared/data-service.service';
@Component({
selector: 'app-real-time-value',
templateUrl: './real-time-value.component.html',
styleUrls: ['./real-time-value.component.css']
})
export class RealTimeValueComponent implements OnInit {
public systems = [];
constructor(private _dataService: DataServiceService,
private route: ActivatedRoute,
) { }
ngOnInit() {
console.log('i\'M ON ngOnInit');
this.system= this._dataService.getSystems_1();
console.log('console.log BEFORE data retrive from data-service.service.ts');
console.log(this.systems);
console.log('console.log AFTER data retrive from data-service.service.ts');
}
}
而不是,因为否则不会有任何被拒绝的承诺。
答案 2 :(得分:1)
你只能抓住一次承诺,你在捕获中返回的是下一个then
将如何解决或拒绝:
Promise.reject(88)
.catch(err=>"Hello World")
.then(resolve=>console.log("resolve is:",resolve))
Promise.reject(88)
.catch(err=>Promise.reject("Hello World"))//reject again
.catch(err=>console.log("reject is:",err))
而不是:
return await a.test(data).then(rd => {
return rd
})
.catch(ed => {
return ed
});`
您可以这样做:return a.test(data)
提供的其他代码根本没有任何意义。如果您想提出一些请求,但希望得到所有结果,即使其中一些失败,您也可以查看this answer(最后一个代码块)。
这个答案解释了为什么会创建promises,我会建议你不要使用异步语法,直到你明白了什么是promise并使用它们。