【发布时间】: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