等待解决 Typescript 订阅中的嵌套循环
Wait to resolve Nested loops in a Typescript Subscribe
Objective:我想等待所有嵌套循环处理完毕,然后才能return最终值。
问题:在处理所有循环之前 return 编辑最终值。
在下面的代码中,我将 paramListToComplete
发送到数据服务以创建记录并在同一调用中获取该新记录,以便我可以在 paramListToComplete
和 return paramListToComplete
使用来自服务的更新值。问题是函数 return 在处理所有循环之前是列表,所以我的 paramListToComplete
仍然不完整。
有谁知道如何等待所有循环处理或可能将所有这些嵌套循环转换为承诺并等待它们全部解决?感谢任何帮助。
CompleteParamList(paramListToComplete): any {
this.dataService.UpdateCall(paramListToComplete)
.subscribe(
data => {
if (data) {
for (var server of paramListToComplete) {
for (var updatedData of data) {
if (paramListToComplete.length === 1 && !server.Name) {
server.Name = updatedData.Name;
}
if (!server.serverCode && server.Name === updatedData.Name) {
server.serverCode = updatedData.serverCode;
for (var serverGroup of server.serverGroups) {
serverGroup.serverCode = updatedData.serverCode;
}
for (var updatedserverGroup of server.UpdatedserverGroups) {
updatedserverGroup.serverCode = updatedData.serverCode;
}
}
}
}
}
}
);
return paramListToComplete;
}
UpdateCall(bdy: Array<testParams>) {
let url = 'endpoint/path';
let body = bdy;
let options;
return this.service.getToken()
.map(Response =>
options = new RequestOptions({
headers: this.httpHelperService.buildHttpHeader(Response.json())
}))
.mergeMap(() => this.http.put(url, body, options)
.map(this.extractData)
.catch((this.handleError)));
}
偷懒!不要在 CompleteParamList
方法中从 UpdateCall
方法订阅可观察的 returned,而是 return 它并让调用者订阅它。
您可以进入流并修改输入参数 paramListToComplete
并假设您使用的是 rxjs versoin 5 或以下版本(对于较新的版本,您可以通过管道传输它),代码将如下所示:
completeParamList(paramListToComplete): Observable<void> {
return this.updateCall(paramListToComplete).tap(data => {
// update paramListToComplete here...
});
}
所以现在无论您在何处使用 completeParamList
,您都可以简单地订阅它或将其转换为 promise(我不推荐这样做,因为 toPromise 在较新版本的 rxjs 中已被弃用)
someMethod() {
const paramList = [];
this.service.completeParamList(paramList).subscribe(_ => {
// paramList has been updated, do your thang here...
});
}
// alternative way
async someOtherMethod() {
const paramList = [];
await this.service.completeParamList(paramList).toPromise();
// do your thang...
}
Objective:我想等待所有嵌套循环处理完毕,然后才能return最终值。
问题:在处理所有循环之前 return 编辑最终值。
在下面的代码中,我将 paramListToComplete
发送到数据服务以创建记录并在同一调用中获取该新记录,以便我可以在 paramListToComplete
和 return paramListToComplete
使用来自服务的更新值。问题是函数 return 在处理所有循环之前是列表,所以我的 paramListToComplete
仍然不完整。
有谁知道如何等待所有循环处理或可能将所有这些嵌套循环转换为承诺并等待它们全部解决?感谢任何帮助。
CompleteParamList(paramListToComplete): any {
this.dataService.UpdateCall(paramListToComplete)
.subscribe(
data => {
if (data) {
for (var server of paramListToComplete) {
for (var updatedData of data) {
if (paramListToComplete.length === 1 && !server.Name) {
server.Name = updatedData.Name;
}
if (!server.serverCode && server.Name === updatedData.Name) {
server.serverCode = updatedData.serverCode;
for (var serverGroup of server.serverGroups) {
serverGroup.serverCode = updatedData.serverCode;
}
for (var updatedserverGroup of server.UpdatedserverGroups) {
updatedserverGroup.serverCode = updatedData.serverCode;
}
}
}
}
}
}
);
return paramListToComplete;
}
UpdateCall(bdy: Array<testParams>) {
let url = 'endpoint/path';
let body = bdy;
let options;
return this.service.getToken()
.map(Response =>
options = new RequestOptions({
headers: this.httpHelperService.buildHttpHeader(Response.json())
}))
.mergeMap(() => this.http.put(url, body, options)
.map(this.extractData)
.catch((this.handleError)));
}
偷懒!不要在 CompleteParamList
方法中从 UpdateCall
方法订阅可观察的 returned,而是 return 它并让调用者订阅它。
您可以进入流并修改输入参数 paramListToComplete
并假设您使用的是 rxjs versoin 5 或以下版本(对于较新的版本,您可以通过管道传输它),代码将如下所示:
completeParamList(paramListToComplete): Observable<void> {
return this.updateCall(paramListToComplete).tap(data => {
// update paramListToComplete here...
});
}
所以现在无论您在何处使用 completeParamList
,您都可以简单地订阅它或将其转换为 promise(我不推荐这样做,因为 toPromise 在较新版本的 rxjs 中已被弃用)
someMethod() {
const paramList = [];
this.service.completeParamList(paramList).subscribe(_ => {
// paramList has been updated, do your thang here...
});
}
// alternative way
async someOtherMethod() {
const paramList = [];
await this.service.completeParamList(paramList).toPromise();
// do your thang...
}