我在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()
这样的东西,但是我没有看到如何在许多“步骤”中使用它,就像在应用程序加载和运行期间可以进行的所有检查一样。
答案 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中很美: - )