Promise.all拒绝来自API

时间:2017-12-27 16:46:00

标签: javascript ecmascript-6 promise es6-promise

我查看了其他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)
});

有人能告诉我为什么我的主要应用程序中没有发现我的捕获? 上面的代码是伪的,但描述了问题。

3 个答案:

答案 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并使用它们。