AngularJS:一旦循环服务方法结束,继续在控制器中执行

时间:2014-11-23 21:43:38

标签: javascript angularjs cordova

我在Angular中使用networkService,当互联网连接关闭时,该角色将循环播放。想法是在连接再次启动后返回并继续执行。

这是一个控制器作为例子

MyApp.controller('StartCtrl', function($scope, $cordovaNetwork, applicationService, networkService) {

  $scope.loading = { message: 'Loading application...' };

  // If we don't have an applicationId yet
  if (localStorage.getItem('applicationId') === null)
  {
    if ($cordovaNetwork.isOffline())
    {
      $scope.loading = { message: networkService.message };
      networkService.wait();
    }
    else
    {
      $scope.loading = { message: 'Connecting application...' };

      applicationService.add();
    }
  }

});

这是网络服务:

MyApp.service(
  "networkService",
  function($window, $cordovaNetwork)
  {
    var message = 'No internet connection';

    function wait()
    {
      if ($cordovaNetwork.isOffline())
      {
        $window.setTimeout(wait, 400);
      }
      else
      {
        message = 'Connected !';

        alert(message);
      }
    }

    // Returns public properties and methods
    return {
      message: message,
      wait:    wait
    };
  }
);

例如,我想在连接恢复后调用applicationService.add()

我觉得我必须使用像.then()这样的东西,但是我没有看到如何在许多“步骤”中使用它,就像在应用程序加载和运行期间可以进行的所有检查一样。

2 个答案:

答案 0 :(得分:1)

如果您还使用AJAX调用,则可以使用promises,因为所有AngularJS AJAX调用都会返回一个承诺。

MyApp.service("networkService", function($q, $window, $cordovaNetwork){
   var message = 'No internet connection';
   var deferred = $q.defer();
   function wait(){
       if ($cordovaNetwork.isOffline()){
           $window.setTimeout(wait, 400);
       }else{
           message = 'Connected !';
           deferred.resolve(message);
       }
   }
   return deferred.promise;
});

// in your controller call: - this is then the same syntax to the AJAX calls in Angular.
networkService.then(function(result){ var message = result.data; });

至于您对异步函数的评论,您可能希望使用https://github.com/caolan/async来查看这有助于整理嵌套函数回调。在你描述的情况下,实际上没有办法绕过嵌套回调 - 技术上Javascript是函数式编程所以它是所有函数和回调,有时人们不会那样使用它(包括我)。

答案 1 :(得分:0)

您可以将一个回调函数作为参数传递给wait函数,如:

function wait(callbackFunc)
    {
      if ($cordovaNetwork.isOffline())
      {
        $window.setTimeout(wait, 400);
      }
      else
      {
       callbackFunc();
      }
    }

现在,当你打电话给等时,你可以通过它:

networkService.wait(applicationService.add); //applicationService.add作为参数传递

因此它将使用闭包并执行与它在控制器中执行的完全相同。这在JS中很美: - )