2017-02-06 86 views
1

我的App.component在我的user service中調用init方法。在組件初始化之前加載數據 - angular 2

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 .forkJoin

init = ((userType: boolean) => { 
    return new Promise((resolve, reject) => { 
     Observable.forkJoin([ 
      this.m1, 
      this.m2]).subscribe(data => { 
       //persist those return data 
      });   
    }); 
} 
  1. 爲什麼都控制檯承諾其調用幾個服務。日誌語句從不得到執行?
  2. 爲什麼它在Observable.forkJoin完成其服務調用之前不阻止組件初始化?

回答

2
  1. (和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中以任何方式阻止執行。
  • +0

    你一直都是對的,但實際上你可以做一個同步服務器調用,所以可以阻止執行:)這是沒有意義的,但它可能是 – smnbbrv

    +0

    好吧,我認爲這已被棄用,但它仍然是有爭議的這確實阻礙了執行。它只是佔用UI線程 - for循環可以做同樣的事情,但正如你所說的 - 無論如何,完全沒有意義:D –

    +0

    :) for循環可以阻止執行,但它永遠無法接收異步調用的結果,因爲它將被推送到事件隊列。阻止執行直到收到異步響應的唯一方法是ES6生成器或異步/等待...仍然毫無意義:D – smnbbrv

    2

    你一定要先解決承諾。

    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()不會發出任何值。

    相關問題