如何在Angular 6中的for循环中移至下一个索引之前等待完成订阅

时间:2018-08-30 12:54:40

标签: angular6 angular-observable

我正在使用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

2 个答案:

答案 0 :(得分:1)

只需在给定i的所需索引处将p_item拼接到您的数组中即可。

例如,而不是这样做,

this.processedItems.push(p_item);

执行此操作

this.processedItems.splice(p_item, 0, i);

这可以解决您的问题:)

答案 1 :(得分:0)

通过使用toPromise方法,使用promise而不是rx.js订阅。您可能需要将 res 映射到json。 res.map(item => 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);
}