【发布时间】:2018-10-30 02:16:50
【问题描述】:
这是来自 Angular 组件的一些代码。它是一个搜索组件,其中characterIndexes 是一个搜索结果数组。
通过在搜索框中输入搜索结果来检索搜索结果,该搜索框会根据其内容触发searchtrigger 或searchEmptyTrigger。在获得第一个结果后,我必须执行另一个 http.post() 来获取属于索引的名称,以便对它们进行排序(我从代码中省略了该部分)。然后将结果插入到characterIndex-array 中。
当searchEmptyTrigger 被触发时会发生类似的事情。除了characterIndex-array 只是设置为空并且不需要 http-requests。
我遇到的问题是,在某些情况下,当searchEmptyTrigger 被触发时,searchtrigger 的代码仍在运行(由于 http-requests 的延迟)。
结果是characterIndexes 首先是空的。然后它会在收到searchtrigger中的http请求的结果后再次填满。
所以最大的问题是:'如何在等待回复时取消我正在运行的http.post()?'
public characters: any[];
public characterIndexes: number[];
let searchBox = document.getElementById('search-box');
let searchTrigger = fromEvent(searchBox, 'input')
.pipe(
map((event: any) => event.target.value ),
filter( text => text.length > 2 ),
debounceTime( 500 ),
distinctUntilChanged(),
switchMap( text => ajax(`https://esi.evetech.net/v2/search/?categories=character&datasource=tranquility&language=en-us&search=^${text}&strict=false`)
)
);
let searchEmptyTrigger = fromEvent(searchBox, 'input')
.pipe(
map((event: any) => event.target.value ),
filter( text => text.length <= 2 )
);
searchTrigger.subscribe( response => {
if( response.response.character ){
let characterIndexes = response.response.character;
this.http.post('https://esi.evetech.net/latest/universe/names/?datasource=tranquility', characterIndexes)
.subscribe( (charactersInfo: any[]) => {
// do some stuff with this.characterIndexes and this.characters = [];
});
} else {
this.characterIndexes = [];
this.characters = [];
}
});
searchEmptyTrigger.subscribe( () => {
// reset values
this.characterIndexes = [];
this.characters = [];
});
PS:我也愿意接受与上述代码执行相同操作的替代方法,我可以在其中取消 http-request。
【问题讨论】:
标签: angular rxjs angular6 rxjs5