2016-04-08 49 views
2

我在Angular服務中封裝了第三方JS庫。我如何保證第三方JS庫加載/初始化/等。在使用我的服務之前?等待第三方JS庫在Angular 2服務中完成初始化的最佳方式?

你可以看看下面的代碼,並告訴我這是不是一個好的編碼練習?我在服務的構造函數中設置了一個承諾(承諾最終會實現),並且我的服務方法取決於該承諾的成功(請參閱getMessages)。

@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