EDIT: я получаю ошибку, как это, когда я последний раз проверял в консоли браузера.
TypeError: Невозможно прочитать свойство 'defer' undefined
Мне нужно вызвать один $ http-запрос, который дает токен, который можно использовать для вызова другого запроса $ http и, наконец, требуемого ответа. Следовательно, я использую обещания заставить его работать синхронно. Однако функция не выполняется после функции $q.defer()
Ниже приведен мой код:
$scope.firstTimeAuth = function($q) {
var deferred = $q.defer();
var ref = window.open('https://accounts.google.com/o/oauth2/auth?client_id=' + clientId + '&redirect_uri=http://localhost/callback&scope=https://www.googleapis.com/auth/fitness.activity.write &approval_prompt=force&response_type=code&access_type=offline', '_blank', 'location=no');
ref.addEventListener('loadstart', function(event) {
if((event.url).startsWith("http://localhost/callback")) {
requestToken = (event.url).split("code=")[1];
$http({
method: "post", url: "https://accounts.google.com/o/oauth2/token",
data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=http://localhost/callback" + "&grant_type=authorization_code" + "&code=" + requestToken
})
.success(function(data) {
defer.resolve(true);
accessToken = data.access_token;
refreshToken = data.refresh_token;
alert("firstTimeAuth success");
if(typeof(Storage) != "undefined") {
localStorage.setItem("refreshToken",refreshToken);
alert(localStorage.getItem("refreshToken"));
} else {
alert("Sorry, your browser does not support Web Storage...");
}
//functions here
})
.error(function(data, status) {
alert("ERROR: " + data);
defer.resolve(true);
});
ref.close();
}
});
return deferred.promise;
}
Это моя вторая функция
$scope.getAcessToken = function($q)
{
var deferred = $q.defer();
alert("inside getAcessToken function");
refreshToken = localStorage.getItem("refreshToken");
if(refreshToken)
{
$http({
method: "post", url: "https://accounts.google.com/o/oauth2/token",
data: "client_secret=" + clientSecret + "&grant_type=refresh_token" + "&refresh_token="+ refreshToken + "&client_id=" + clientId
})
.success(function(data){
accessToken = data.access_token;
alert("getAcessToken success" + accessToken);
deferred.resolve(true);
})
.error(function(data,status){
alert("ERROR: " + JSON.stringify(data) + status);
deferred.resolve(true);
});
}
else
{
$scope.firstTimeAuth();
}
return deferred.promise;
}
и я называю их так.
alert("not installed");
var lastSaved = $scope.getFirstEpochTime();
//walkthroug
//Registe
$scope.firstTimeAuth().then(function(){
alert("firstime done");
$scope.getDataSets().then(function(){
alert(" in the last block");/*
$scope.handleResponse().then(function(){
$scope.insert().then(function(){
$scope.select();
})
alert("done in installed");
})
*/})
})
Пожалуйста, дайте мне знать, что не так с кодом. Я очень новичок в этом.. спасибо.
Определяя параметр для функции, вы создаете локальную переменную, которая скрывает что-либо с тем же именем во внешней области. В вашем случае вы определяете:
$scope.firstTimeAuth = function($q) {}
И тогда вы вызываете его как $scope.firstTimeAuth();
во многих местах. Поскольку вы ничего не пропускаете, $q
в области функций будет неопределенным. Вы должны только вводить его во всю область контроллера и удалять такие параметры, указанные в методах области видимости, чтобы он не скрывал введенную службу.
Или, если по какой-то причине вы должны их пропустить, сделайте это правильно.
Вы вводите $q
в свой controller
на первом месте.
angular.module('module.name').controller('ControllerName',
['$scope', '$q', function ($scope, $q) {
}]);
Я не понимаю, почему вы передаете $q
своей функции, вам это не нужно. $scope.firstTimeAuth = function($q) {