如何在 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);

这解决了你的问题:)