TypeScript:
getSocialDataTwitter(searchQuery) {
this.fetchLists(searchQuery);
const headers = new HttpHeaders().set('content-type', 'application/json');
return this.http.post<RightOperatorPaneltwitter>(this.baseUrl + 'api/OperationData/GetAllTweetsByNamePost', this.lists, { headers }).subscribe(result => {
this.tweets = result;
}, error => console.error(error));
}
fetchLists(searchQuery) {
this.listService.getLists()
.subscribe((data: List[]) => {
data.forEach(d => {
if (d.name === searchQuery) {
this.lists = d;
}
})
});
}
我是Angular 5 + .Netcore 2.0的新手。我想使用fetchLists
通过node.js从我的mongo数据库中获取数据。并将其发送到我的api控制器。我正在从数据库中成功获取数据。第一次单击后,控制器的对象处于默认的初始化状态,第二次单击后,控制器将获得我期望的数据。有没有办法等待fetchLists
完成过程,然后执行向api控制器请求的发布。我希望用户单击一次后即可看到数据。
我以为使用.subcribe
是异步的吗?
答案 0 :(得分:1)
如果我对您的理解正确,则可以在此处简单地执行发布请求:
fetchLists(searchQuery) {
this.listService.getLists()
.subscribe((data: List[]) => {
data.forEach(d => {
if (d.name === searchQuery) {
this.lists = d;
}
})
// EXECUTE HERE
});
}
这样,您将获取列表,对其进行处理,然后执行您的帖子。使用可观察对象称为反应式编程。如here所述,
反应式编程是使用异步数据流进行编程
答案 1 :(得分:1)
据我所知,您的问题是执行了 this.fetchLists(searchQuery),但是在将列表填充到subscription-方法之前,API-Post已经完成。
我认为您可以使用ES2017异步/等待功能来解决此问题:
async getSocialDataTwitter(searchQuery) {
await this.fetchLists(searchQuery);
const headers = new HttpHeaders().set('content-type', 'application/json');
return this.http.post<RightOperatorPaneltwitter>(this.baseUrl + 'api/OperationData/GetAllTweetsByNamePost', this.lists, { headers }).subscribe(result =>
{
this.tweets = result;
}, error => console.error(error));
}
答案 2 :(得分:1)
我认为您想要的是使用合并映射链接两个调用。我修改了您的示例以显示操作方法。
首先,您的fetchLists
方法不应订阅列表服务,而应仅转换数据并返回可观察的结果。然后,在您的getSocialDataTwitter
方法中,您将调用fetchLists
并使用mergeMap链接您的第二个http调用。
fetchLists(searchQuery) {
// Make note how we map the result and then return the observable
// without subscribing.
return this.listService.getLists()
.pipe(
map((data: List[]) => data.find(d => d.name === searchQuery))
)
}
getSocialDataTwitter(searchQuery) {
// As the headers and url will not change, we can define them here
const headers = new HttpHeaders().set('content-type', 'application/json');
const url = this.baseUrl + 'api/OperationData/GetAllTweetsByNamePost';
// Here we call our initial method, but instead of subscribing directly
// we use mergeMap to chain our observables
this.fetchLists(searchQuery)
.pipe(
// Lists is the result we created with the map in fetchLists.
mergeMap(lists => this.http.post<RightOperatorPaneltwitter>(url, lists, { headers }))
)
// Only after we subscribe here, the list service is called.
.subscribe(result => this.tweets = result);
}
答案 3 :(得分:0)
您可以创建其他方法,该方法将调用fetchlist并返回可观察的结果,然后我们可以调用getSocialDataTwitter()方法。
The backend was *originally* set to 'TkAgg' by the following code: