在 AngularJS 中处理不再需要的异步数据
Handling no longer needed async data in AngularJS
情况是这样的:您有一个用户在您的 AngularJS 应用程序上输入垃圾邮件,这当然会在后端创建各种异步数据调用。问题是,随着这些数据提取中的每一个返回,用户将在屏幕上看到数据多次更改,希望用户最终停留的数据是最后出现的数据,所以这就是他们看到的数据。
但我们不能指望这一点,因为异步意味着无法保证顺序。很有可能页面 C 的数据先于页面 B 的数据到达,而用户没有等待显示就跳过了。现在,用户看到了页面 B 的数据,因为最后返回的是页面 B,但他们认为他们看到的是页面 C。我们如何防止这种情况发生?
解决这个问题的方法很简单:使用令牌!每个承诺在创建时都会携带令牌的本地副本,并将检查主令牌以确保它仍然相关:
var self = this;
// our token generator
self.generateToken = function() {
return return Math.floor(100000000 + Math.random() * 900000000);
}
// our latest token
self.getData = function() {
self.asyncToken = self.createToken();
var myToken = self.asyncToken;
var request = $http({url: "http://google.com"});
var promise = request.then(function(response) {
if (myToken !== self.asyncToken) {
console.log("Got data for expired request. Ignoring.");
return;
}
// this is data we wanted, so we continue
self.doStuff(response.data);
});
return promise;
};
$http 接受取消器参数,这是一个可用于取消先前请求的承诺。当您要提出新请求时,您会想要取消该请求。这是一个基本的例子。请注意,最佳做法不建议在您的控制器中使用 $http。
var canceller = $q.defer();
$http.get("/api/movies/slow/2", { timeout: canceller.promise })
.then(function(response){
$scope.movie = response.data;
});
$scope.cancel = function(){
canceller.resolve("user cancelled");
};
在此处阅读更多内容:http://odetocode.com/blogs/scott/archive/2014/04/24/canceling-http-requests-in-angularjs.aspx
情况是这样的:您有一个用户在您的 AngularJS 应用程序上输入垃圾邮件,这当然会在后端创建各种异步数据调用。问题是,随着这些数据提取中的每一个返回,用户将在屏幕上看到数据多次更改,希望用户最终停留的数据是最后出现的数据,所以这就是他们看到的数据。
但我们不能指望这一点,因为异步意味着无法保证顺序。很有可能页面 C 的数据先于页面 B 的数据到达,而用户没有等待显示就跳过了。现在,用户看到了页面 B 的数据,因为最后返回的是页面 B,但他们认为他们看到的是页面 C。我们如何防止这种情况发生?
解决这个问题的方法很简单:使用令牌!每个承诺在创建时都会携带令牌的本地副本,并将检查主令牌以确保它仍然相关:
var self = this;
// our token generator
self.generateToken = function() {
return return Math.floor(100000000 + Math.random() * 900000000);
}
// our latest token
self.getData = function() {
self.asyncToken = self.createToken();
var myToken = self.asyncToken;
var request = $http({url: "http://google.com"});
var promise = request.then(function(response) {
if (myToken !== self.asyncToken) {
console.log("Got data for expired request. Ignoring.");
return;
}
// this is data we wanted, so we continue
self.doStuff(response.data);
});
return promise;
};
$http 接受取消器参数,这是一个可用于取消先前请求的承诺。当您要提出新请求时,您会想要取消该请求。这是一个基本的例子。请注意,最佳做法不建议在您的控制器中使用 $http。
var canceller = $q.defer();
$http.get("/api/movies/slow/2", { timeout: canceller.promise })
.then(function(response){
$scope.movie = response.data;
});
$scope.cancel = function(){
canceller.resolve("user cancelled");
};
在此处阅读更多内容:http://odetocode.com/blogs/scott/archive/2014/04/24/canceling-http-requests-in-angularjs.aspx