2016-04-08 8 views
2

AngularサービスでサードパーティのJSライブラリをラッピングしています。サードパーティのJSライブラリがロード/初期化されたことなどをどのように保証することができますか?私のサービスを使用する前に?サードパーティのJSライブラリがAngular 2サービスで初期化を完了するのを待つ最善の方法は?

次のコードをご覧になり、これがの良いコーディング慣行である場合は教えてください。私はサービスのコンストラクタ(約束が最終的に達成される)に約束を設定しています。サービスメソッドは、その約束の成功に依存しています(getMessages参照)。そのexempleで

@Injectable() 
export class GmailService { 

    private _readyPromise; 

    // Load Gmail API client library. 
    // gapi.client.load() returns a promise. 
    constructor() { 
    this._readyPromise = gapi.client.load('gmail', 'v1'); 
    } 

    private ready():Promise { 
    return this._readyPromise; 
    } 

    // Return Gmail messages for the current user. 
    getMessages() { 
    return this.ready().then(() => { 
     return gapi.client.gmail.users.messages.list({ 
     'userId': 'me' 
     }).then(resp => console.log(resp)); 
    }); 
    } 
} 

、私には、JavaScriptのためのGmailのAPIを使用したことだし、それはgapi.client.load()はすでにコードを簡素化する約束を、返すことが判明。別のシナリオでは、私は自分の約束を作り、特定の条件が満たされたときにそれを手動で履行することができました。

答えて

3

あなたのアプローチはうまくいくようです。もう一つは、GmailのAPIライブラリがロードされた後、アプリケーションをブートストラップするために、次のようになります。

var app = platform(BROWSER_PROVIDERS) 
    .application([BROWSER_APP_PROVIDERS, appProviders]); 

gapi.client.load('gmail', 'v1').then(() => { 
    return app.bootstrap(AppComponent); 
}); 

この方法は、あなたはあなたのアプリケーション内でそれを使用した場合、ライブラリの準備ができていることを確認してくださいます。

グローバルアプローチを説明する対応するplunkrはhttps://plnkr.co/edit/ooMNzEw2ptWrumwAX5zP?p=previewです。

関連する問題