可观察的嵌套循环
我想创建一个嵌套的可观察性来保存与标记相关的一个内容。首先保存内容并返回内容标识,以便将内容标识作为外键保存,方法与在我的循环中同时发送数据的方式类似。 (后端日志运行pararel)我怎样才能使它等到做下一步要做一个可观察的嵌套循环
component.ts
save(){
this.contentService.savecontent(this.content_input) // save content
.subscribe(
data => { this.listContentData = data }, // return data to get content id
error => { error = error },
() => {
this.savetag(this.listContentData); // save tag
});
}
savetag(listcontentdata): void {
// listdraftCategories is a list of tag
for (var i = 0; i < this.listdraftCategories.length; i++) {
this.tagService.savetagwithcontent(this.listdraftCategories[i], listcontentdata)
.subscribe(
data => { data = data },
error => { },
() => {
});
}
}
service.ts
savecontent(contentObj: any): Observable<any> {
contentObj = JSON.parse(contentObj);
let body = JSON.stringify(
{
"token": "test",
"content": {
"contentName": contentObj.itemName // contentId will be autoincrement in backend
}
}
}
);
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.post(this.host + this.url_content + this.url_save, body, options)
.map(res => this.extractData(res))
.catch(this.handleError);
}
savetagwithcontent(tagObj: any, contentObj: any): Observable<any> {
console.log("obj", contentObj);
let body = JSON.stringify(
{
"token": "test",
"content": {
"fkTag": {
"tagId": tagObj.tagId
},
"fkContent": {
"contentId": contentObj.responseObject[0].contentId
}
}
}
);
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.post(this.host + this.url_tag_has_content + this.url_save, body, options)
.map(res => this.extractData(res))
.catch(this.handleError);
}
后台日志(保存的内容标签)
--- start save tag with content ---
--- start save tag with content ---
--- content id : 1 tag id: 1 ---
--- content id : 1 tag id: 2 ---
--- end save tag with content ---
--- end save tag with content ---
看起来像它在几乎同时在方法中。我如何设法使savetag等待一个保存完成然后做下一个?
我想它会使用递归方法做的方法:
savetag(listcontentdata:any, index = 0): void {
if(index >= this.listdraftCategories.length){
return;
}
// listdraftCategories is a list of tag
this.tagService.savetagwithcontent(this.listdraftCategories[index], listcontentdata)
.subscribe(
data => {
data = data;
this.savetag(listcontentdata, index +1);
},
error => { },
() => {
});
}
这样,你的savetag
方法的下一次迭代将只启动一次当前的observable
完成相应操作。
尝试这样:
const observables = [];
for (var i = 0; i < this.listdraftCategories.length; i++) {
observables.push(this.tagService.savetagwithcontent(this.listdraftCategories[i], listcontentdata));
}
let i = 0;
let finished = true;
while(i < observables.length) {
if (finished) {
finished = false;
observables[i].subscribe(
data => {
finished = true;
i++;
data = data
},
error => { },
() => {});
}
}
可能有一些漂亮的rxjs运营商,但是我不知道它。
你也可以改变你的设计一点点。您可以向后端端点发送给定类别的所有标签,并在那里处理保存标签。你将完全控制你想如何保存它们。
是的,我认为这样的太,但太糟糕的服务已经写了,我没有授权编辑它。 :( –
该死的:)。那么while循环呢? – kit
我现在有无限循环,而我console.log(我)我试着记录observables.length和它返回0,而我记录observables我看到观察数组 –
你的代码它的工作,但我需要通过添加if(index
哦,是的抱歉我做了这个例子,告诉你如何添加一个递归方法,让我解决这个错误。 – Supamiu
如果我有其他标签列表,我该如何使用相同的方法来管理它? (如listdraftIndustries,listdraftCompany如何保存savetag方法,如果它不是相同的列表,我不能使用相同的索引权?) –