【问题标题】:Breaking the loop after checking the result from observable in angular从角度观察结果检查结果后打破循环
【发布时间】:2020-06-18 09:25:21
【问题描述】:

我想在检查 observable 返回的条件后打破循环。当状态为 False 时,我想退出循环。我有以下代码:

var response = Observable<responseService>;
var i;
for (i =0; i < lin.length; i++){
 response = this.http.post<responseService>(this.Url, {}, options).pipe(
    map(data => {
      return data;
    }),
    catchError((err) => {
      return of(null);
      }
    ));

  var res = response.map(x => x.status);
  console.log(res);
  if (res === "False" || res === null) {
    response{
     status: "FALSE",
     message: "ERROR"
    }
   return of(response);
  }
}
return response;

但我收到以下 if 条件的错误

“条件将始终返回 false,因为类型 'Observable ' 和 'string' 没有重叠”。

如果有人知道我做错了什么或有解决方案,我将不胜感激。谢谢!

【问题讨论】:

  • 这是异步调用,直到您的 if 条件,请求可能无法完成。使用 await 读取 observable 以等待回答

标签: javascript angular rxjs observable


【解决方案1】:
  1. 您没有订阅 observable 并尝试将 observable 与字符串进行比较。当你比较 if (res === "False" || res === null) 时,res 变量仍然是一个 observable。

  2. 嵌套订阅不是一个好习惯。如果您希望按顺序发出每个请求,直到一个请求发出 Falsenull,它在这里对您没有帮助。

您可以尝试创建一个请求数组并使用 RxJS 的 from 函数和 concatMap 运算符按顺序订阅它。如果满足条件,则使用takeUntil 运算符打破序列。试试下面的

import { Subject, from, of } from 'rxjs';
import { takeUntil, concatMap } from 'rxjs/operators';

private getData() {
  let closeRequest$ = new Subject<any>();
  let response = Observable<responseService>;
  let requests = Observable<responseService>[];
  for (let i =0; i < lin.length; i++) {
    requests.push(this.http.post<responseService>(this.Url, {}, options))   // <-- don't map response here
  }

  from(requests).pipe(
    concatMap(request => of(request)),
    takeUntil(closeRequest$)
  ).subscribe(
    response => {
      if (!response['status'] && response['status'] === "False") {    // <-- check for `response.status` truthiness
        // response is false
        this.someVar = { status: "FALSE", message: "ERROR" };
        this.closeRequest$.next();
        this.closeRequest$.complete();
      } else {
        this.someVar = status;
      }
    },
    error => { }
  );
}

【讨论】:

  • 条件检查仍然出现同样的错误。 @Michael D
  • @CodeVenture:那你做的事情和我做的不一样。请在问题中发布您现在正在尝试的内容。
  • 我还更新了代码以检查 status 属性的真实性,而不是将其与 null 进行比较。
  • 您如何从响应中获取状态属性? Intelisense 未显示属性状态。它抱怨它在 observable 中不存在。
  • 这是一个 TS lint 错误。用括号表示法替换点。我已经编辑了答案。它不会影响实际程序,因为在运行时该属性是可用的。
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 2021-06-27
  • 2013-07-12
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多