【发布时间】:2019-04-11 09:27:42
【问题描述】:
我有一个代码,我在其中使用 subscribe 调用一个可观察的函数。 我希望它并行运行,但它是按顺序运行的。
makedownloadData() 是将“showData”列表变量的所有变量存储在不同变量中的函数,比如说“downloadData”。函数需要大量时间将所有变量复制到 downloadData 和进一步处理。所以我想使用可观察/订阅技术调用这个函数,以便它应该并行运行而不会导致当前序列延迟,但它只是按顺序运行。没有增强。
第一种方法(没有可观察的)
调用函数
this.downloadData=this.makeDownloadData() //This step is taking lot's of time as function respond late.
console.log("print after function call")
要调用的函数
public makeDownloadData() {
var main_data = this.showData;
var down_data:any = [];
for (var i=0; i<main_data.length; i++){
var element: String = "";
var newDate = new Date(main_data[i]["@timestamp"]);
element = element.concat(this.convertDateToLocalFormat(newDate)+" ");
element = element.concat(String(main_data[i]["cu_hostname"])+" ");
element = element.concat(String(main_data[i]["log_agent"])+".");
element = element.concat(String(main_data[i]["log_level"])+" ");
element = element.concat(String(main_data[i]["app_name"])+": ");
element = element.concat(String(main_data[i]["log_message"])+" ");
down_data.push(element.concat("\n"));
}
return down_data;
}
输出:
//Execution of function
"print after function call"
第二种方法(使用可观察)
导入需求
import { Observable } from 'rxjs';
import 'rxjs/add/observable/of'
调用可观察函数。
this.makeDownloadData().subscribe(response => {
console.log("Expected to print after") //This should be run in parallel and must printed after upcoming statement as this function is taking time to respond.
console.log(response); //Expected to print after
},
error => {
console.log("Did not got response")
});
console.log("Expected to print before")
要调用的函数
public makeDownloadData(): Observable<any> {
var main_data = this.showData;
var down_data:any = [];
for (var i=0; i<main_data.length; i++){
var element: String = "";
var newDate = new Date(main_data[i]["@timestamp"]);
element = element.concat(this.convertDateToLocalFormat(newDate)+" ");
element = element.concat(String(main_data[i]["cu_hostname"])+" ");
element = element.concat(String(main_data[i]["log_agent"])+".");
element = element.concat(String(main_data[i]["log_level"])+" ");
element = element.concat(String(main_data[i]["app_name"])+": ");
element = element.concat(String(main_data[i]["log_message"])+" ");
down_data.push(element.concat("\n"));
}
return Observable.of(down_data)
}
输出:
"Expected to print after"
Printing response
"Expected to print before"
预期输出:
"Expected to print before"
"Expected to print after"
Printing response
我想使用 observable 进行并行执行。请帮忙。如果有任何不清楚的地方,我会修改问题以使其更清楚。 谢谢
【问题讨论】:
-
你好,你的代码对我来说似乎没问题,应该可以工作。 makeDownloadData 方法需要多少时间?因为如果没有数据,它可以在第二个 console.log 之前完成
-
您好,感谢您的回复。 “makeDownloadData”大约需要。 10秒返回。所以直到那个时候它也不会打印更多的行并等待函数完成执行。 10 秒后,它将按照代码中编写的顺序依次打印两行。
-
在你返回你的 observable 之前,makeDownloadData() 是完全同步的。您可以尝试 setTimeout(() => this.downloadData=this.makeDownloadData()) 之类的方法。这会将函数放在事件循环中的行尾(是否没有 setTimeouts 等待时间设置)并且您当前的方法将继续。但是当事件循环选择它运行时执行需要时间,如果你当时正在做某事,它会冻结 util 函数结束。如果该计算需要很长时间,您可以考虑使用网络工作者...
标签: angular rxjs observable angular2-observables