在.subscribe()中分配并返回一个变量

时间:2018-06-15 23:37:50

标签: javascript angular

我试图在.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. ")
}

1 个答案:

答案 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,

        ); 
       }

LIVE DEMO