Обещание в JavaScript, функция не выполняется после использования $ q.defer

0

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");
          })
        */})
      })

Пожалуйста, дайте мне знать, что не так с кодом. Я очень новичок в этом.. спасибо.

Теги:
ionic-framework

2 ответа

1

Определяя параметр для функции, вы создаете локальную переменную, которая скрывает что-либо с тем же именем во внешней области. В вашем случае вы определяете:

$scope.firstTimeAuth = function($q) {}

И тогда вы вызываете его как $scope.firstTimeAuth(); во многих местах. Поскольку вы ничего не пропускаете, $q в области функций будет неопределенным. Вы должны только вводить его во всю область контроллера и удалять такие параметры, указанные в методах области видимости, чтобы он не скрывал введенную службу.

Или, если по какой-то причине вы должны их пропустить, сделайте это правильно.

  • 0
    да, я попытался удалить $ q, который я вызвал в функции. однако функции все еще не синхронизируются. спасибо за указание на проблему. Я понял это теперь, когда локальная декларация скрывала декларации во внешней области.
  • 0
    Вы можете предложить что-нибудь. ??? Я могу поделиться с вами проектом. Я действительно застрял в этой проблеме на пару дней. :(
Показать ещё 1 комментарий
1

Вы вводите $q в свой controller на первом месте.

angular.module('module.name').controller('ControllerName', 
        ['$scope', '$q', function ($scope, $q) {

}]);

Я не понимаю, почему вы передаете $q своей функции, вам это не нужно. $scope.firstTimeAuth = function($q) {

  • 0
    да, я вставил $ q в контроллер ... но это не помогло, так что я подумал, что я не могу вызвать его в аргумент функции.
  • 0
    @Shravan: Вы не должны передавать это в качестве аргумента своей функции, удалять ее ... и она должна работать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню