【问题标题】:Continue for loop when observable is complete当 observable 完成时继续 for 循环
【发布时间】:2017-07-20 05:56:38
【问题描述】:

我在 for 循环中调用 http.get 服务,我的代码工作正常,问题是即使 observable 不完整,循环也会继续。

这是我的代码:

Angular 2 组件:

let max = 5;
for (let i = 1; i <= max; i++) {
    let boxNo = i > 9 ? "0" + i : "00" + i;
    this.invoiceService.generateChecklist(prefixAndLetter, boxNo).subscribe(
        result => {
            console.log(result.data);
        }
    )
}

MVC 控制器:

[HttpGet]
public ActionResult GenerateChecklist(string prefixAndLetter, string boxNo)
{
    if (!string.IsNullOrWhiteSpace(prefixAndLetter))
    {
        return Json(new { success = true, data = boxNo }, JsonRequestBehavior.AllowGet);
    }
    return null;
}

这是我得到的结果:

002
003
001
005
004

【问题讨论】:

  • 我不是角度专家,但我很确定它应该以这种方式工作。您在循环中对服务器进行异步调用,因此您的循环不会等待并继续发出异步请求。每当收到响应时,处理程序将在subscribe 中执行,一旦完成,循环将继续。
  • 是的,这就是这段代码的运行方式。
  • @CodingYoshi。您写的内容是错误的:“无论何时收到响应,处理程序都会在订阅中执行,一旦完成,循环将继续”。 异步意味着您不知道订阅何时执行,因此没有“一旦完成,循环将继续”。循环的作用是将一堆订阅回调附加到一堆可观察对象而不等待任何东西。您无法控制何时调用回调。
  • @angularfrance 不,这没有错。如果循环创建了前 x 个异步调用,则有可能其中一个异步调用可能已返回。因此,事件循环中会有一些东西。在某些时候需要执行处理程序代码,也就是代码只能执行此操作,因为只有一个线程,所以它会在处理程序中完成代码,然后才能发出另一个异步请求。它不能同时做两件事。我知道异步是什么意思。
  • “异步意味着你不知道订阅何时执行”正是我的观点。当订阅者被执行时,有可能只发送了 3 个异步请求。一旦处理程序完成,它可能会发出另一个异步请求。

标签: c# asp.net-mvc angular observable


【解决方案1】:

您也许可以使用concatAll,它会在通知订阅者之前等待所有异步调用完成:

let boxes = [];
let max = 5;
for (let i = 1; i <= max; i++) {
    let boxNo = i > 9 ? "0" + i : "00" + i;
    boxes.push(boxNo);
}

Observable.of(boxes.map(t=> this.invoiceService.generateChecklist(prefixAndLetter, t)))
     .concatAll()
     .subscribe(result => {
           result.forEach((item)=> console.log(item.data));
      });

【讨论】:

  • 恐怕你的代码是错误的。您在普通数组 (boxes) 上使用来自 RxJS 的 concatAll() 运算符,它不起作用。 concatAll() 需要一个 observable 来操作:Observable.of(boxes.map(...)).concatAll().subscribe()
  • 你说得对,pixelbits,我不应该这么消极。代码并非全错,只是不是 100% 正确 ;-)
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多