如何在 Angular 6 中的 for 循环中移动到下一个索引之前等待完成订阅
How to wait to finish subscribe before moving to next index in for loop in Angular 6
我正在使用 Angular 6
。
我有一个链接数组和一个变量,用于按照与数组相同的顺序逐个存储获取的信息。
这是我使用 for
循环尝试做的事情。
products: any;
processedItems: Array<any> = [];
private _processItem() {
for (let i = 0; i < this.products.length; i++) {
this.scraperService.scrapSingle(this.products[i].url).subscribe(
res => {
if (res.status.http_code === 200) {
const properties = this.scraperService.processSingleProduct(res.contents);
const p_item = {};
p_item['info'] = this.products[i];
p_item['properties'] = properties;
this.processedItems.push(p_item);
}
console.log(res);
}
);
}
console.log(this.products.length);
}
但是在循环中移动到下一个索引之前如何等待 subscribe
?
通过使用 toPromise 方法使用承诺而不是 rx.js 订阅。您可能需要将 res 映射到 json。 res.map(项目 => item.json());
products: any;
processedItems: Array < any > =[];
private _processItem() {
this.products.array.forEach(async (element) => {
const res = await this.scraperService.scrapSingle(element.url).toPromise();
if (res.status.http_code === 200) {
const properties = this.scraperService.processSingleProduct(res.contents);
const p_item = {};
p_item['info'] = element
p_item['properties'] = properties;
this.processedItems.push(p_item);
}
console.log(res);
});
console.log(this.products.length);
}
只需将 p_item 拼接到给定 i 所需索引处的数组中。
例如,而不是做,
this.processedItems.push(p_item);
这样做,
this.processedItems.splice(p_item, 0, i);
这解决了你的问题:)
我正在使用 Angular 6
。
我有一个链接数组和一个变量,用于按照与数组相同的顺序逐个存储获取的信息。
这是我使用 for
循环尝试做的事情。
products: any;
processedItems: Array<any> = [];
private _processItem() {
for (let i = 0; i < this.products.length; i++) {
this.scraperService.scrapSingle(this.products[i].url).subscribe(
res => {
if (res.status.http_code === 200) {
const properties = this.scraperService.processSingleProduct(res.contents);
const p_item = {};
p_item['info'] = this.products[i];
p_item['properties'] = properties;
this.processedItems.push(p_item);
}
console.log(res);
}
);
}
console.log(this.products.length);
}
但是在循环中移动到下一个索引之前如何等待 subscribe
?
通过使用 toPromise 方法使用承诺而不是 rx.js 订阅。您可能需要将 res 映射到 json。 res.map(项目 => item.json());
products: any;
processedItems: Array < any > =[];
private _processItem() {
this.products.array.forEach(async (element) => {
const res = await this.scraperService.scrapSingle(element.url).toPromise();
if (res.status.http_code === 200) {
const properties = this.scraperService.processSingleProduct(res.contents);
const p_item = {};
p_item['info'] = element
p_item['properties'] = properties;
this.processedItems.push(p_item);
}
console.log(res);
});
console.log(this.products.length);
}
只需将 p_item 拼接到给定 i 所需索引处的数组中。
例如,而不是做,
this.processedItems.push(p_item);
这样做,
this.processedItems.splice(p_item, 0, i);
这解决了你的问题:)