我的App.component
在我的user service
中调用了init方法。
ngOnInit(){
this.init(true).then(data => {
console.log("OnInit Called")
})
}
User.service
会返回promise
,而account.init
会调用init = (isRegistered) => {
return new Promise((resolve, reject) => {
this.account.init(isRegistered).then(data => {
//some data inialization
console.log("OnInit Called User Service")
});
});
}
Account.service
Observable
返回一个使用init = ((userType: boolean) => {
return new Promise((resolve, reject) => {
Observable.forkJoin([
this.m1,
this.m2]).subscribe(data => {
//persist those return data
});
});
}
调用多个服务的promise .forkJoin
File mydir = getDir("users", Context.MODE_PRIVATE); //Creating an internal dir;
if (!mydir.exists()) {
mydir.mkdirs();
}
//Getting a file within the dir.
try {
for (int i = 0; i < 100; i++) {
File fileWithinMyDir = new File(mydir, "myfile" + i);
outputStream = new FileOutputStream(fileWithinMyDir); //Use the stream as usual to write into the file.
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
答案 0 :(得分:2)
resolve(...)
缺少init = (isRegistered) => {
return new Promise((resolve, reject) => {
this.account.init(isRegistered).then(data => {
//some data inialization
console.log("OnInit Called User Service")
resolve(/*someValue */); // <<<== missing
// or reject(/* someValue */);
});
});
}
ngOnInit()
。例如,您可以使用*ngIf
在数据尚不可用之前不显示任何内容。
您还可以使用路由器防护来防止在数据可用之前创建组件。 https://angular.io/docs/ts/latest/guide/router.html#!#resolve-guard
但是没有办法在JS中以任何方式阻止执行。答案 1 :(得分:2)
你必须首先解决Promise。
init = (isRegistered) => {
return new Promise((resolve, reject) => {
this.account.init(isRegistered).then(data => {
// some data initialization
if (data) {
resolve(...);
} else {
reject(...);
}
console.log("OnInit Called User Service")
});
});
}
很难说出问题是什么,因为我们不知道this.m1
和this.m2
是什么。
使用forkJoin()
时不要感到惊讶。如果其中一个源Observable失败或未发出任何值并过早完成,则此运算符forkJoin()
不会发出任何值。