Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中,函数在使用$q.defer后不会执行_Javascript_Angularjs_Ionic Framework - Fatal编程技术网

在javascript中,函数在使用$q.defer后不会执行

在javascript中,函数在使用$q.defer后不会执行,javascript,angularjs,ionic-framework,Javascript,Angularjs,Ionic Framework,编辑:当我最后一次在浏览器控制台中检查时,我得到一个类似这样的错误 TypeError:无法读取未定义的属性“defer” 我需要调用一个$http请求,该请求提供可用于调用另一个$http请求和最终所需响应的令牌。 因此,我使用承诺使其同步工作。但是,函数在$q.defer()函数之后不会执行 以下是我的代码: $scope.firstTimeAuth = function($q) { var deferred = $q.defer(); var ref = window.

编辑:当我最后一次在浏览器控制台中检查时,我得到一个类似这样的错误

TypeError:无法读取未定义的属性“defer”

我需要调用一个$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;
  }
这是我的第二个功能

我这样称呼他们


请让我知道代码有什么问题。我对这个很陌生。。谢谢。

您是否首先在
控制器中注入
$q

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

}]);

我真的不明白你为什么要把
$q
传递给你的函数,你不需要这样
$scope.firstTimeAuth=function($q){

您是否首先在
控制器中注入
$q

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

}]);

我真的不明白你为什么要把
$q
传递给你的函数,你不需要这样做。
$scope.firstTimeAuth=function($q){

通过定义一个函数的参数,你在创建一个局部变量,它在外部范围中隐藏任何同名的东西。在你的例子中,你定义:

$scope.firstTimeAuth = function($q) {}
然后在许多地方像调用
$scope.firstTimeAuth();
一样调用它。由于您不传递任何内容,函数范围中的
$q
将是未定义的。您应该只将其注入整个控制器范围,并删除在范围方法中指定的此类参数,这样它就不会隐藏注入的服务


或者,如果出于某种原因必须传递它们,请正确执行。

通过定义函数的参数,您正在创建一个局部变量,它将在外部范围中隐藏任何具有相同名称的内容。在您的情况下,您正在定义:

$scope.firstTimeAuth = function($q) {}
然后在许多地方像调用
$scope.firstTimeAuth();
一样调用它。由于您不传递任何内容,函数范围中的
$q
将是未定义的。您应该只将其注入整个控制器范围,并删除在范围方法中指定的此类参数,这样它就不会隐藏注入的服务


或者,如果出于某种原因必须传递它们,请正确执行。

是的,我在控制器中插入了$q。。但这没有帮助,因此我应该在函数参数中调用它。@Shravan:你不应该将其作为参数传递给函数,将其删除……它应该会工作。是的,我已将其删除。现在我不再收到错误。但是这些函数仍然没有同步调用。你能提出什么建议吗?我可以和你分享这个项目。我真的陷入了这个问题好几天了(是的,我已经在控制器中插入了$q。。但是这没有帮助,所以我应该在函数参数中调用它。@Shravan:你不应该将它作为参数传递给你的函数,删除它…它应该会工作。是的,我已经删除了它。现在我不再收到错误。但是函数仍然没有被同步调用。。你能提出任何建议吗事情。??我可以和你分享这个项目。我真的陷入了这个问题好几天了(是的,我已经尝试删除我在函数中调用的$q。但是函数仍然没有得到同步。感谢您指出问题。我现在意识到本地声明将声明隐藏在外部范围中。您能提出任何建议吗????我可以与您共享该项目。我真的陷入了这个问题一段时间几天了。:(@Shravan您可能想更新问题并准确解释您正在尝试做什么…您似乎有访问令牌、刷新令牌、本地存储等。我不确定到底什么不起作用。您可以从
then()的成功回调中返回承诺)
返回的承诺只有在从
返回承诺后才能解析。然后()
以防您不知道。是的,我已尝试删除我在函数中调用的$q。但是函数仍然没有同步。感谢您指出问题。我现在意识到,本地声明将声明隐藏在外部范围中。您能提出建议吗?我可以与您共享该项目。我是真的陷入这个问题好几天了。:(@Shravan你可能想更新这个问题,并准确地解释你想做什么…你似乎有访问令牌、刷新令牌、本地存储等等,我不确定到底什么不起作用。你可以从
then()的成功回调中返回一个承诺)
返回的承诺只有在从
返回承诺后才能解析。然后()
以防您不知道。