我试图在.subscribe
内部分配变量,但我无法让它返回正确的值。代码发布在下面,让我知道如何正确返回变量成功。
createIndexes(environmentName, csvReindexCommands){
let success = false;
this.swaggerApi.createOrUpdateElasticSearchIndexSchema(environmentName, csvReindexCommands).subscribe(
x => {success = x.success},
err => {success = err.statusText}
);
return success
}
更新
successCounter = 0;
errorCounter = 0;
createIndexes(environments, csvReindexCommands){
for (let i = 0; i < environments.length; i++){
this.swaggerApi.createOrUpdateElasticSearchIndexSchema(environments[i], csvReindexCommands).subscribe(
x => {this.successCounter += 1},
err => {this.errorCounter += 1}
);
}
displayNotification("This operation ran successfully " + this.successCounter + " times. ")
}
答案 0 :(得分:2)
您正在使用 async programming
,您无法暂停代码的执行或让它等待,您的订阅将来会被解决,但您无法预测何时。 displayNotification
之外的subscribe
会在您的订阅解决之前执行,这就是为什么它未定义的原因。
如果您需要制作多个HTTP请求,则应选择RXJS
运算符,这样可以使您的工作更轻松
你可以用
mergeMap
concatMap
forkJoin
您的问题是concatMap
的完美用例
Requests with concatMap() vs mergeMap() vs forkJoin()
更新您的服务
createOrUpdateElasticSearchIndexSchema(environments:any[].......)
{
return from(environments)
.pipe(
concatMap(id => <Observable<any>> this.httpc.post('url;))
);
}
有三种功能可用于向可观察的用户发送数据
complete(): void
Observer回调,用于从Observable接收完整类型的无值通知。
error(err: any): void
Observer回调接收来自Observable的类型错误通知,附带错误。
next(value: T): void
Observer回调接收来自Observable的类型为next的通知,值为。
在可观察执行期间,可以对observer.next()
进行无限调用,但是,当调用observer.error()
或observer.complete()
时,执行将停止,并且不会再向订阅者传递数据。
您可以将complete
用于您的用例..
<强>组件:强>
successCounter = 0;
errorCounter = 0;
createIndexes(environments, csvReindexCommands){
this.swaggerApi.createOrUpdateElasticSearchIndexSchema(environments[i], csvReindexCommands).subscribe(
x => this.successCounter += 1,
err => this.errorCounter += 1,
()=>displayNotification("This operation ran successfully " + this.successCounter + " times. ")
);
}
您也可以使用finalize
运算符。
createIndexes(environments, csvReindexCommands){
this.swaggerApi.createOrUpdateElasticSearchIndexSchema(environments[i], csvReindexCommands).
pipe(finalize(()=>displayNotification("This operation ran successfully " + this.successCounter + " times. "))
.subscribe(
x => this.successCounter += 1,
err => this.errorCounter += 1,
);
}