在组件初始化之前加载数据 - 角度2

时间:2017-02-06 11:26:26

标签: javascript angular typescript rxjs rxjs5

我的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();
        }
  1. 为什么两个console.log语句永远不会被执行?
  2. 为什么在Observable.forkJoin完成其服务调用之前,它不会阻止组件的初始化?

2 个答案:

答案 0 :(得分:2)

  1. (和2.)致电resolve(...)缺少
  2. 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 */);
            });          
        });   
    }
    
    1. 你为什么期望它阻止任何事情?无法阻止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.m1this.m2是什么。

使用forkJoin()时不要感到惊讶。如果其中一个源Observable失败或未发出任何值并过早完成,则此运算符forkJoin()不会发出任何值。