在 angular 6 中使用 http 轮询 api 中的 takeWhile 时无响应
No response while using takeWhile in angular 6 for polling api using http
我有一个客户端 API,我想对其进行轮询,直到 returns 成功结果,此 API returns 响应如下 JSON。
{
"count": 0,
"meta": {
"status": "PENDING",
"total": 3185,
"completion_percentage": 0,
"total_available": 0,
"hotels_filtered": 0,
"offers": 0
},
data:[]
}
并且肯定的结果应该包含状态 ='COMPLETED' 并且提交的数据将在数据中包含结果,我尝试使用来自 'rxjs'
的 takeWhile
component.ts
var headers = { headers: new HttpHeaders({ 'x-user-agent':'M;B2B' }) };
var url='https://api.xyz.com/hotels/v1/search/entity/27548283?apikey=1234567'
this.http.get(url,headers)
.pipe(
takeWhile((data)=>JSON.parse(JSON.stringify(data)).meta.status==='COMPLETED')
)
.subscribe((result)=>{
console.log(result);
},(err)=>{
console.log(err);
})
但不幸的是我没有得到任何订阅日志方法,
这是正确的方法吗?
我的angular版本是6.
我认为您正在寻找 retryWhen
运算符:
let httpGet$ = this.http.get(url, headers);
let retryFilter = data => JSON.parse(JSON.stringify(data)).meta.status !== 'COMPLETED';
httpGet$.pipe(
map(data => {
if(retryFilter(data)) {
throw 'retry';
}
return val;
}),
retryWhen(_ =>
// retry after 3 sek when retryFilter (above) failed
_.pipe(delayWhen(_ => timer(3000))),
)
).subscribe(result => console.log(result));
我有一个客户端 API,我想对其进行轮询,直到 returns 成功结果,此 API returns 响应如下 JSON。
{
"count": 0,
"meta": {
"status": "PENDING",
"total": 3185,
"completion_percentage": 0,
"total_available": 0,
"hotels_filtered": 0,
"offers": 0
},
data:[]
}
并且肯定的结果应该包含状态 ='COMPLETED' 并且提交的数据将在数据中包含结果,我尝试使用来自 'rxjs'
的 takeWhilecomponent.ts
var headers = { headers: new HttpHeaders({ 'x-user-agent':'M;B2B' }) };
var url='https://api.xyz.com/hotels/v1/search/entity/27548283?apikey=1234567'
this.http.get(url,headers)
.pipe(
takeWhile((data)=>JSON.parse(JSON.stringify(data)).meta.status==='COMPLETED')
)
.subscribe((result)=>{
console.log(result);
},(err)=>{
console.log(err);
})
但不幸的是我没有得到任何订阅日志方法, 这是正确的方法吗?
我的angular版本是6.
我认为您正在寻找 retryWhen
运算符:
let httpGet$ = this.http.get(url, headers);
let retryFilter = data => JSON.parse(JSON.stringify(data)).meta.status !== 'COMPLETED';
httpGet$.pipe(
map(data => {
if(retryFilter(data)) {
throw 'retry';
}
return val;
}),
retryWhen(_ =>
// retry after 3 sek when retryFilter (above) failed
_.pipe(delayWhen(_ => timer(3000))),
)
).subscribe(result => console.log(result));