javascript - AngularJS 中的 Promise

标签 javascript jquery angularjs promise

我尝试使用 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 使用 jqLit​​e,您可以使用 .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/

相关文章:

angularjs - 带有对象数组的 Angular Material md-switch

Javascript 在教程中未声明窗口大小

javascript - 为什么无法在指令的 html 调用中访问 $rootScope?

javascript - 不一致的未捕获类型错误

javascript - 在 jQuery 可调整大小的对象中查看事件值

jQuery Mobile 控件组水平布局问题

php - 如何使用 jQuery 或任何其他方法根据浏览器窗口宽度动态加载不同的 php 文件

angularjs - Uncaught Error : [$injector:modulerr] http://errors. angularjs.org/1.2.14/$injector/modulerr

javascript - 如何在子事件触发时阻止事件(链接)

javascript - 如何在 Typescript 的 Angular 指令类中添加 Controller