我有一個問題對象,其中一個屬性是一個工具對象的數組。問題和工具是我數據庫中的兩個不同的表格。如何使用先前的http請求中的數據創建http請求?
在我的問題-log.component我調度一個動作來搜索匹配我的搜索查詢的問題。這工作得很好。
我一直在試圖做的下一件事是,將問題列表和每個問題ID都傳遞給我的工具服務,以便我可以獲得與該問題相關的工具。
我能夠得到這個工作的方式是添加另一個偵聽ISSUE.SEARCH.COMPLETE操作的效果。然後,我瀏覽了我的工具服務中的一系列問題,以便我可以爲每個問題ID調用API服務,並將工具屬性添加到該問題。這在一些方面似乎是錯誤的。一個是,對於大型問題列表,需要很長時間才能加載所有工具,如果我嘗試啓動另一個問題搜索,我必須等待工具從前一個加載,然後我的應用纔會響應。二,將整個問題數組傳遞到工具服務似乎是錯誤的,因爲我一次只需要一個問題id來獲取與該問題相關的工具列表;這不會使我的工具服務在我的應用程序的其他地方輕鬆重新使用。
我希望不要等到我的API調用才能獲取問題列表,然後才能開始獲取與每個問題ID相關的工具。是否可以在我的issuesSearch $ effect中添加代碼,在下面評論的地方,開始添加工具,因爲我的問題列表正在構建中?
組件:
@Component({
selector: issue-log,
template: `
<issue-search (search)="search($event)></issue-search>
<issue-list [issues]=$issues | async></issue-list>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class IssueLogComponent {
issues$: Observable<Issue[]>;
constructor(private store: Store<fromRoot.State>) {
this.issues$ = store.select(fromRoot.getIssueSearchResults);
}
search(query) {
this.store.dispatch(new issue.IssueSearch(query));
}
}
效果:
@Effect() issueSearch$: Observable<Action> = this.actions$
.ofType(issue.ISSUE_SEARCH)
.debounceTime(300)
.map(toPayload)
.switchMap(query => {
if (query === '') {
return empty();
}
const nextSearch$ = this.actions$.ofType(issue.ISSUE_SEARCH).skip(1);
return this.issueService.getIssuesFromQuery(query) //calls API service
.takeUntil(nextSearch$)
.mergeMap((res: Issue[]) => {
// How do I make another API call here, passing data from each element of res array?
return Observable.from([
new issue.IssueSearchComplete(res)
])
})
.catch(() => of(new issue.IssueSearchComplete([])));
});
我也試圖從我的問題服務中打電話給我服務的工具,但不認爲這是正確的做法無論是。
我認爲這[post](https://stackoverflow.com/questions/35268482/chaining-rxjs-observables-from-http-data-in-angular2-with-typescript?rq=1)是有幫助的方向使用.flatMap或可能.forkJoin,但我仍然不確定將其包裝在循環中以獲取我的響應的每個元素。也許使用.forEach? – ksimonson10
因此,您想要獲得問題並能夠立即訪問這些問題,同時在每個問題中使用數據在後臺進行更多異步調用? – Lansana
是的,這可能嗎? – ksimonson10