2016-09-15 174 views
0

我试图用Java Spring构建一个AngularJS单页应用程序作为休息服务。Angularjs在破坏页面之前完成所有承诺

目前我的控制器可以让我保存所有数据填充到后端,我有我的代码是这样的:

$scope.$on('$destroy', function() { 
    personalDataService.saveData.query({}, { 
     personalData: $scope.personalData 
    }, function (res) { 
     console.log(res); 
    }); 
}); 

在另一页,我装的数据部分来自同表,以便做一些验证,例如检查用户是否是女性,以确定她需要填写另一个表单。

问题是,当我离开这个页面时,保存的承诺还没有返回,第二页已经加载并且数据没有完成。如果我再次刷新第二页,那么一切都恢复正常

有没有什么办法来确保所有的承诺已经在销毁/离开这个页面之前返回?

+0

您可以使用拦截器,以保持所有的承诺的轨道。根据承诺的状态,您可以启用或禁用第二页的链接。 –

+0

如果数据必须跨越会话,则使用cookie或localStorage,这两者都是同步处理的。否则,将数据保存在JavaScript中。 –

回答

-1

建立你的所有正在运行的承诺的阵列(例如,通过将它们存储在一个service,在$rootScope或通过events),并通过使用$q.all()等待完成:

$scope.$on('$destroy', function() { 
    $q.all($rootScope.promises).then(function(){ 
     console.log('all promises finished'); 

    }); 
} 
+0

downvote,downvoter的原因? – Luxor001

0

一旦承诺是解决,发出一个事件。

function saveFields() { 

    var deferred = $q.defer(); 

    // in your save fields function, resolve the promise on success save or reject the promise on error. 

     onSaveCall(args, onSuccess, onFail); 

     var onSucess = function() {deferred.resolve()}; 

    return deferred.promise; 
} 

$scope.$on('destroy', function() { 
    onSaveCall.then(function() { 
     // Here your save fields is resolved then write your code to emit or notify. 
    }) 
}) 

如果你有一个以上的承诺使用promises.all https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all