0

我尝试使用 加载json文件angularjs,并从过滤器$q返回数据。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并从过滤器返回它的内容?

谢谢你。

4

3 回答 3

3

您可以同步执行此操作

AngularJS 使用 jqLit​​e,你可以像在 jQuery 中一样创建一个普通的GET请求.ajax并传递一个标志。async:false使所有 AJAX 同步的一种方法是:

$.ajaxSetup({async:false});

您也可以在任何请求的选项部分执行此操作。

但你不应该

真的,AJAX 在设计上是异步的,JavaScript在执行异步 i/o 方面蓬勃发展,这就是为什么它是一门很棒的语言。如果您执行同步 ajax,屏幕将冻结,直到 AJAX 到达,这将造成非常糟糕的用户体验。

我要做的是从 AJAX 执行方法返回一个承诺,当它解析时让它更新另一个范围变量,然后过滤。更好的是,您可以将上面的代码编写为:

 return $.getJSON(url);

完全避免延期。使用该 deferred 称为deferred 反模式

于 2013-05-24T10:27:58.393 回答
0

getJSON异步工作。我建议你ajax改用。

$.ajax({
  dataType: "json",
  url: url,
}).done( function(json) {
  j = json;
});
于 2013-05-24T10:27:50.750 回答
0

您应该返回驻留在延迟对象中的承诺。您需要做的是将您的返回码替换为:

return deferred.promise;

说明:Promises 是处理异步代码的一种非常好的方法。你喜欢做的是向调用函数返回一个承诺,上面写着“我给你这个承诺,当我的回调函数返回时,我会返回一个结果”,当稍后执行回调时,你应该(实际上是正确地做) 用您想要返回的数据解决延迟。这个解析调用激活了链接到您返回的承诺的“ then ”函数。

在接收功能上,您应该“等待”要解决的承诺,例如:

functionThatReturnPromise()
.then(function(result){
    //This is a handler function that called when you call "**deferred.resolve(json)**" so **result** object will hold the **json** object.
...})
.then(function(result){
    //Here you can chain promises as much as you want because "**then**" return the same promise.
})
.catch(function(err){
    //If instead of "**deferred.resolve(json)**" you will call "**deferred.reject(someErr)**" you will end up in this handler function
}
于 2014-11-22T14:21:24.760 回答