我尝试使用 angularjs
、$q
加载 json
文件,并从 angular
过滤器返回数据。
我有一个 Angular 过滤器:
MyApp.filter('my_filter', function ($q){
return function(input){
var deferred = $q.defer();
var j = {};
$.getJSON(url, function(json) {
j = json;
deferred.resolve(json);
});
return j;
但我得到了{}
。我如何同步加载 json
并从过滤器返回其内容?
谢谢。
最佳答案
您可以同步执行此操作
AngularJS 使用 jqLite,您可以使用 .ajax
创建普通的 GET
请求,并向其传递 async:false
标志,就像在 jQuery 中一样。使所有 AJAX 同步的一种方法是:
$.ajaxSetup({async:false});
您还可以在任何请求的选项部分中执行此操作。
但你不应该
确实,AJAX 在设计上是异步的,JavaScript 在执行异步 I/O 方面表现出色,这就是为什么它是一种很棒的语言。如果您执行同步 Ajax,屏幕将卡住,直到 AJAX 到达为止,这将造成非常糟糕的用户体验。
我要做的是从 AJAX 执行方法返回一个 promise ,当它解析时更新另一个作用域变量,并过滤那个。更好的是,您可以将上面的代码编写为:
return $.getJSON(url);
完全避免延期。使用该延迟称为 the deferred anti-pattern .
关于javascript - AngularJS 中的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16732696/