【问题标题】:Subscribe inside subscribe and return an observable in Angular在 subscribe 中订阅并在 Angular 中返回一个 observable
【发布时间】:2019-05-30 19:59:47
【问题描述】:

在这方面真的需要帮助。我一直在尝试不同的东西,但它不起作用。

function1() {
  return this.apiService.get().pipe(map(data => {
    return this.function2();
  }));
  }

function2() {
   const urls = [];

   for (let i = 1; i <= 5; i++) {
      urls.push(
        this.apiService
          .get('/users/?page=' + i)
          .pipe(map(data => data))
      );
    }

   forkJoin(...urls).subscribe(data => {
     data.forEach(element => {
        results = results.concat(element.results);
      });
     return results;
     })
    }


this.someService.function1().subscribe(data => {
console.log(data);
})

所以基本上,我想打印出我在 function1() 中订阅的数据。但是function1()的结果依赖于另一个subscribe()的function2()。

我知道为什么,但就是不知道如何解决。当我运行脚本时,我总是不确定,原因是 function1() 无法等待 function2() 返回结果。

我被困在这里了。谢谢,

回答:我发现我不应该将 function2 中的结果作为数组返回。

function2() {
   const urls = [];

   for (let i = 1; i <= 5; i++) {
      urls.push(
        this.apiService
          .get('/users/?page=' + i)
          .pipe(map(data => data))
      );
    }

   return forkJoin(urls);

然后根据 function2 的输出,我将在 function1 中完成剩下的工作,即 concat()....

【问题讨论】:

  • function2 是否依赖于 function1 的结果?
  • @robert 是的。来自 function1() 的数据将是调用 function2 的扩充。
  • @robert 我刚刚更新了我的问题。请看一下。谢谢
  • 没关系,我想我已经解决了问题。

标签: javascript angular typescript


【解决方案1】:

你会想要switchMap - Documentation

function1 获得结果后,您想“切换”到等待function2

function1() {
    return this.apiService.get().pipe(switchMap(function1Data => {
        // Send function2 whatever data it needs
        // Example:
        return this.function2(function1Data.function2Argument).pipe(map(function2Data => {
            // Combine function1Data and function2Data as needed
            // Example:
            const result = {
                function1Property: function1Data.property,
                function2Property: function2Data.property
            };
            return result;
        }));
    });
}

【讨论】:

  • 感谢您的回答。我已经尝试过了,但我得到“无法读取未定义的属性'管道'”。 function2() 的返回是一个数组。我不确定这是否会导致问题。
  • 我刚刚更新了我的问题。请快速查看function2。谢谢
  • 没关系。我已经根据您的推荐解决了这个问题。这有帮助。再次感谢。
猜你喜欢
  • 2018-11-23
  • 2022-01-07
  • 2018-03-09
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多