在foreach内部执行第一个可观察到的订阅结束后结果为空



我使用的是离子3,角5,我不确定我的代码出了什么问题,我的结果总是在foreach内部没有可观察的结果。这是我的代码:

articlepanier : Article[] = [];
this.storage.get(TOKEN_KEY).then(token => {
let isExpired = helper.isTokenExpired(token);
if(!isExpired){  
//foreach loop 
this.cart.forEach((element, index) => {
var article = new Article();
article.artid = element.artid;
article.artcode = element.artcode;
//value of the sales unit quantity
article.plvqteuv = element.amount;

let data = {
pricode: this.pricode,
artcode: element.artcode
};
//use observable to return stock available in the database  
//and change the value of the article.plvqtyisvalid by false value at each line 
//if the quantity entered exceeds the quantity available
this.cardProvider.stockbyarticle(data).subscribe((res: any) => {
if( res.quantity < element.amount ){
//change boolean status quantity is valid
article.plvqtyisvalid = false;
}

//method changes the contents of array
this.articlepanier.splice(index, 0, article);

console.log(this.articlepanier);
});

});
//Here outside of foreach, I want the result of array after executing foreach (this.articlepanier) to be used in a if condition 
//But articlepanier is always empty
if(this.articlepanier.filter(c =>(c.plvqtyisvalid  == true).length > 0){
//recording the cart in database 
}

});

我想要前臂内侧可观察到的结果,但这个。主动脉瓣始终是空的,她的前臂外侧

我在这里看到多个问题

  1. 您在forEach中订阅。因此,每个元素都将构成一个单独的订阅。相反,您可以使用RxJS函数,如forkJoincombineLatestzip来并行订阅多个可观测值。

  2. 您正在尝试同步访问异步变量articlepanier。当您尝试在订阅之外访问它时,它还没有调整。您需要使用RxJS操作符(如switchMap(使整个流反应。

尝试以下

import { from, forkJoin } from 'rxjs';
import { filter, map, switchMap } from 'rxjs/operators';
from(this.storage.get(TOKEN_KEY)).pipe(
filter(token => !(helper.isTokenExpired(token))),
switchMap(_ => {
return forkJoin(this.cart.map((element, index) => {
const article = new Article();
article.artid = element.artid;
article.artcode = element.artcode;
article.plvqteuv = element.amount; //value of the sales unit quantity
let data = {
pricode: this.pricode,
artcode: element.artcode
};
return this.cardProvider.stockbyarticle(data).pipe(
tap((res: any) => {
if (res.quantity < element.amount) { // change boolean status quantity is valid
article.plvqtyisvalid = false;
}
this.articlepanier.splice(index, 0, article); // method changes the contents of array
console.log(this.articlepanier);
})
)
}))
})
).subscribe(
res => {
if (this.articlepanier.filter(c => (c.plvqtyisvalid == true).length > 0)) {
// recording the card in database 
}
}
);

注意,我使用RxJSfrom函数将this.storage.get(TOKEN_KEY)函数返回的Promise转换为observable。最好是使用Promises或Observables,而不是将它们组合在一起。我还使用RxJSfilter运算符来检查令牌是否仍然有效。

最新更新