S.B*_*.B. 0 javascript ajax angularjs
为简单起见,假设我有一个AngularJS应用程序,其中2个控制器同时执行,用于网站的不同部分.两个控制器都需要来自单个工厂的相同AJAX数据,这些工厂API看起来像这样:
app.factory('API', ['$http', function($http){
return {
getData: function(callback) {
$http({method: 'GET', url: '/data'}).success(function(data, status, headers, config) {
callback(data);
});
}
};
}]);
Run Code Online (Sandbox Code Playgroud)
两个控制器执行API.getData(...) 在同一时间(所以首先得到响应之前),准确地接收相同的数据,但是用它做不同的事情.第二次(和后续)调用getData实际使用第一个请求中的数据的最佳方法是什么,一旦它在那里,而不是创建另一个AJAX调用?控制器对彼此一无所知,并且当只有其中一个进行此调用时也应该工作.
也许我过于复杂了,但我提出的唯一解决方案是callback在工厂范围的队列中手动排队所有函数,然后在"单例"AJAX调用完成时一起执行它们.有一个更好的方法吗?
我已经读过了$q.all,但它不适用于此(我认为),因为我实际上只想要一个请求而不是多个请求.
而不是传入回调,而是从函数返回promise.然后从第一个$ http调用中保存promise,这样当它被解析时,它会解析调用该函数的所有内容.像这样的东西:
app.factory('API', ['$http', function($http){
var dataPromise;
return {
getData: function() {
if (!dataPromise)
{
dataPromise = $http({method: 'GET', url: '/data'});
}
return dataPromise
}
};
}]);
Run Code Online (Sandbox Code Playgroud)
然后在控制器中你可以使用返回的promise做任何数量的事情(参见promise文档),但是上面代码的功能等价物就像tis:
API.getData().success(function(data) {
//my callback code
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |