Angular 6 个 observables - 从 .subscribe() 函数中提取数据并在别处使用
Angular 6 observables - extract data from .subscribe() function and use it elsewhere
我正在用 observables 撞墙。我能找到的几乎所有文档都采用较旧的 rxjs
语法。
我有一个 API 调用,它是一个可观察的。我在别处调用它并订阅它 - 试图用来自这个 GET
请求的数据填充 table。
如果我只是 console.log
我的 getData
函数,它会记录订阅而不是我的数据。
我可以在 .subscribe
函数中成功 console.log data
,但我想在 .subscribe()
.
之外使用 data
如何从 .subscribe()
函数中提取 data
并在其他地方使用它?或者,我的所有逻辑都必须包含在 .subscribe()
函数中才能使用 data
吗?
getData2() {
return this.m_dbService.get('api/myApiPath').subscribe(
data => (console.log(data)), //This properly logs my data. How to extract `data` out of here and actually use it?
error => { throw error },
() => console.log("finished")
);
}
workbookInit(args){
var datasource = this.getData2(); // this returns the subscription and doesn't work.
}
您不应该订阅 getData2
中的 Observable
。 Return 改为原样,然后执行以下操作:
var dataSource;
this.getData2().subscribe(res => dataSource = res);
请注意变量 dataSource
将在请求完成时设置(异步),因此您不能在同一块范围内立即使用它。
如果您想立即使用它,请将您的代码放入订阅中。
只是 return 来自 getData()
的 HTTP 请求并在 workbookInit
函数中订阅它。
getData2() {
return this.m_dbService.get('api/myApiPath')
}
workbookInit(args){
this.getData2().subscribe(
data => {
var datasource = data
},
error => { throw error },
() => console.log("finished")
}
您可能想要做的是用数据填充另一个 Observable
,这样您就可以在项目的其他地方访问它,而无需多次调用 API。
为此,您创建了所谓的 Subject
(在本例中为 BehaviorSubject
),您可以在 API 调用 [=39] 时用数据填充它=]是回应。
然后,为了在其他地方访问此数据,您可以创建一个 "get" 函数来 return Subject
(它本身就是一个 Observable
)需要数据。
这是一个例子:
my-data.service.ts
myData: BehaviorSubject<number> = new BehaviorSubject<number>(0);
callApi() {
this.dbService.get('apiUrl').subscribe(
(data) = > this.myData.next(data) // Assuming data is a 'number'
);
}
getMyData() {
return this.myData.asObservable();
}
现在在组件中使用它:
this.myService.getMyData().subscribe(
(data) => { /* Use the value from myData observable freely */ }
);
或者您可以依赖 Angular async pipe(这是在您的代码中处理可观察对象的一种非常方便的方法)。
如果您有一个提供数据来填充 table 的可观察对象,最好的方法是不要使用 subscribe()
,而是直接在您的 html 模板中使用可观察对象,方法是使用async
管道。您将无需担心,您的代码也将更加简单。
我正在用 observables 撞墙。我能找到的几乎所有文档都采用较旧的 rxjs
语法。
我有一个 API 调用,它是一个可观察的。我在别处调用它并订阅它 - 试图用来自这个 GET
请求的数据填充 table。
如果我只是 console.log
我的 getData
函数,它会记录订阅而不是我的数据。
我可以在 .subscribe
函数中成功 console.log data
,但我想在 .subscribe()
.
data
如何从 .subscribe()
函数中提取 data
并在其他地方使用它?或者,我的所有逻辑都必须包含在 .subscribe()
函数中才能使用 data
吗?
getData2() {
return this.m_dbService.get('api/myApiPath').subscribe(
data => (console.log(data)), //This properly logs my data. How to extract `data` out of here and actually use it?
error => { throw error },
() => console.log("finished")
);
}
workbookInit(args){
var datasource = this.getData2(); // this returns the subscription and doesn't work.
}
您不应该订阅 getData2
中的 Observable
。 Return 改为原样,然后执行以下操作:
var dataSource;
this.getData2().subscribe(res => dataSource = res);
请注意变量 dataSource
将在请求完成时设置(异步),因此您不能在同一块范围内立即使用它。
如果您想立即使用它,请将您的代码放入订阅中。
只是 return 来自 getData()
的 HTTP 请求并在 workbookInit
函数中订阅它。
getData2() {
return this.m_dbService.get('api/myApiPath')
}
workbookInit(args){
this.getData2().subscribe(
data => {
var datasource = data
},
error => { throw error },
() => console.log("finished")
}
您可能想要做的是用数据填充另一个 Observable
,这样您就可以在项目的其他地方访问它,而无需多次调用 API。
为此,您创建了所谓的 Subject
(在本例中为 BehaviorSubject
),您可以在 API 调用 [=39] 时用数据填充它=]是回应。
然后,为了在其他地方访问此数据,您可以创建一个 "get" 函数来 return Subject
(它本身就是一个 Observable
)需要数据。
这是一个例子:
my-data.service.ts
myData: BehaviorSubject<number> = new BehaviorSubject<number>(0);
callApi() {
this.dbService.get('apiUrl').subscribe(
(data) = > this.myData.next(data) // Assuming data is a 'number'
);
}
getMyData() {
return this.myData.asObservable();
}
现在在组件中使用它:
this.myService.getMyData().subscribe(
(data) => { /* Use the value from myData observable freely */ }
);
或者您可以依赖 Angular async pipe(这是在您的代码中处理可观察对象的一种非常方便的方法)。
如果您有一个提供数据来填充 table 的可观察对象,最好的方法是不要使用 subscribe()
,而是直接在您的 html 模板中使用可观察对象,方法是使用async
管道。您将无需担心,您的代码也将更加简单。