为什么 google javascript 客户端库函数在 angularjs 框架中最后执行?

Why does the google javascript client library functions execute last within the angularjs framework?

我想这可能是我对 google javascript 客户端库的加载方式的误解,但是为什么 javascript api 调用在加载时优先级最低在 angularJS 框架内调用。我知道这听起来很复杂,所以这里有一个具体的例子。

这是一个完整的网络应用程序,因此我将缩小我认为最相关的代码范围。这是我在控制器中调用的函数。:

$scope.isRegistered = function () {
var joe = function () {

    gapi.client.conference.isRegistered().
        execute(function(resp){
            $scope.$apply(function() {
                if (resp.error){
                    $log.error('There was an Error');
                }
                else {
                    $log.info("Success");
                    return resp.data;
                }
            });
        });
    };

    joe();

    $log.info("testing");
};

我的 html(部分)中有这个作为要执行的测试用例:

<button ng-click="isRegistered()">IsRegs</button>

当我点击我的按钮时。我期望的是控制台首先打印出 gapi.client 函数,然后打印出 "testing" 字符串:

1.)"success" 2.)"testing"

它打印以下内容(抱歉没有足够的代表指向 post 一张图片):

1.)"testing" 2.)"成功

我 运行 更多测试,但最重要的是,我期望函数 joe() 在 $log.info("testing") 之前先执行。为什么 $log.info("testing") 先执行,然后 gapi 调用?

我将需要以特定顺序执行 gapi 调用,并且根据我的测试,它始终具有最低优先级。在实际执行 gapi 调用之前,它将始终执行并完成函数体的其余部分。

这是为什么?

我想按照我编写代码的顺序首先执行 gapi 调用,而不是最后。长话短说,如果没有按照我编写的顺序调用它,这会弄乱我其余代码的逻辑。

关于这是为什么的任何提示?我可以覆盖 gapi 调用以使其以第一优先级执行吗?

我仍在仔细阅读 google client javascript library 以获取更多线索。在这里的任何帮助将不胜感激。谢谢。

由于 Google API 请求的异步性质,"testing" 字符串总是首先打印(您在 $log.info("testing"); 行执行后得到响应).获得所需结果的一种方法是使用 $q 服务:

// need to inject the $q service
$scope.isRegistered = function () {
  var joe = function () {
    var deferred = $q.defer();
    gapi
      .client
      .conference
      .isRegistered()
      .execute(function (res) {
        $scope.$apply(function () {
          if (res.error) {
            $log.error('There was an Error');
            deferred.reject(res.error);
          }
          else {
            $log.info("Success");
            deferred.resolve(res.data);
          }
        });
      });
    return deferred.promise;
  };

  joe()
    .then(function (data) {
      $log.info("Got some data", data);
      $log.info("testing");
    });
};