2016-07-12 3 views
2

Я пытаюсь загрузить библиотеку аутентификации Google с помощью обещаний, но я терпеть неудачу, когда пытаюсь вызвать gapi.auth2.getAuthInstance() и вернуть ее в обещание;Загрузка GoogleAuth библиотеки с обещаниями

Вот как я это делаю:

var loadPlatform = function ($q) { 
    var deferred = $q.defer(), 
     platform = document.createElement('script'); 

    platform.src ='https://apis.google.com/js/platform.js'; 
    platform.type = 'text/javascript'; 
    platform.async = true; 
    platform.defer = true; 
    platform.onload = deferred.resolve; 
    platform.onerror = deferred.reject; 

    document.body.appendChild(platform); 

    return deferred.promise; 
}; 

//I return this from other function 
return loadPlatform($q) 
    .then(function() { 
     var deferred = $q.defer(); 

     gapi.load('auth2', function() { 
      deferred.resolve(gapi.auth2); 
     }); 

     return deferred.promise; 
    }) 
    .then(function (auth2) { 
     //This function retuns Promise 
     //https://developers.google.com/identity/sign-in/web/reference#gapiauth2initparams 
     return auth2.init(params); 
    }) 
    .then(function (GoogleAuth) { 
     //Here I should have solved GoogleAuth object 
    }); 

Все работает, пока я не вернусь auth2.init (PARAMS), то браузер зависает. Что здесь происходит?

ответ

1

Я только что испытал ту же проблему.

Похоже, вы не можете связать init() обещание объекта auth2.

Мне пришлось обернуть его, чтобы избежать замораживания браузера.

return new Promise<void>(resolve => { 
    gapi.auth2.init({ 
    client_id: this._clientId, 
    scope: 'profile' 
    }).then(() => resolve()); 
}) 

Кроме того, было интересно, что я не мог применить функцию resolve непосредственно.

.then(resolve); 

Update

сказанное выше

Как, возвращаемый объект init() вызова не обещание, это своего рода оберткой и возвращает только реальную обещание, когда вы назвали .then метод

enter image description here

return gapi.auth2.init({ 
    client_id: this._clientId, 
    scope: 'profile' 
}).then(); 
// Auth2 only returns a promise, when we chained into the PromiseLike object once. 
Смежные вопросы