【问题标题】:AngularJS. How to update a directive after a promise is resolved in a service?角JS。在服务中解决承诺后如何更新指令?
【发布时间】:2015-01-23 18:24:55
【问题描述】:

这是对我的previous question 的跟进。

我有一个需要一些时间的 AJAX 请求。假设我得到两部分数据,var1 和 var2。我只想在绑定到主控制器范围的指令中使用 var1

var1: '=',

我从服务中获得了 var1 和 var2 的组合,但由于它们有不同的目的,我不能简单地使用从 $http 调用中获得的一个承诺。

我尝试实现它,但它仍然无法按我的预期工作。服务形式如下:

myModule.service('MyService', ['$http', '$q', function($http, $q) {
    var var1 = $q.defer();
    var var2 = $q.defer();
    httpPromise = $http({
        url: "/myService",
        method: "GET",
        params: {}
    }).success(function(data, status) {
        var1.resolve(data.var1);
        var2.resolve(data.var2);
    })

    return {
        getVar1: function() {
            return var1.promise;
        },
        getVar2: function() {
            return var2.promise;
        },
    }
}]);

在控制器中,我按如下方式分配承诺:

$scope.var1 = MyService.getVar1();
$scope.var2 = MyService.getVar2();

但是,一旦在服务中解决了承诺,该指令似乎不知道 var1 的值已更改。我认为这将由 AngularJS 引擎处理。

在我看来,这里唯一的方法是进行大量 then() 调用,这会带来更多的混乱而不是好处。我想我会留下来(我想这是一个丑陋的黑客......)

$scope.$watch('var1', ...)

在指令内,除非有人告诉我更好的方向。

【问题讨论】:

  • 你需要使用then()来访问promise解析的数据。你的vars 现在只是承诺。还有为什么要分开?只需将整个数据对象传递给控制器​​,然后将其中一个属性传递给指令。也不需要$q,因为$http 返回一个承诺。只是添加代码膨胀

标签: angularjs asynchronous promise


【解决方案1】:

在我看来,您只需要拨打一个then() 电话,使用then() 是使用承诺的正确方法:

指令内部:

var1.then(function (value) {
    // use the resolved value
});

关于承诺的一些旁注:

这是多余的:

return {
    getVar1: function() {
        return var1.promise;
    },
    getVar2: function() {
        return var2.promise;
    },
}

你可以这样做:

return {
    var1Promise: var1.promise,
    var2Promise: var2.promise,
};

然后像这样访问它们:

$scope.var1 = MyService.var1Promise;

得到完全相同的结果。


您还成为deferred antipattern 的牺牲品,它实际上在您的代码中引入了错误(如果您的$http 调用失败,您将无法捕获错误)。

您可以在没有延迟的情况下实现您的服务,代码行数更少,最重要的是具有捕获错误的能力,如下所示:

myModule.service('MyService', ['$http', '$q', function($http, $q) {
    var httpPromise = $http({
        url: "/myService",
        method: "GET",
        params: {}
    });

    return {
        var1Promise: httpPromise.then(function (response) {
            return response.data.var1;
        }),
        var2Promise: httpPromise.then(function (response) {
            return response.data.var2;
        }),
    };
}]);

我同意你的观点,所有那些.then() 电话并不是世界上最美丽的景象。当箭头函数得到广泛支持时,我会很高兴的。

【讨论】:

  • 非常感谢。这就是我一直在寻找的。​​span>
猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 2018-03-15
  • 2014-03-28
  • 2021-12-14
  • 2014-11-12
  • 2020-04-28
  • 2019-07-07
  • 1970-01-01
相关资源
最近更新 更多