AngularJS。在服务中解决 promise 后如何更新指令?

标签 angularjs asynchronous promise

这是我的 previous question 的后续内容.

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

var1: '=',

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

我尝试实现它,但它仍然没有像我想象的那样工作。该服务具有以下形式:

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;
        },
    }
}]);

在 Controller 中,我按如下方式分配 promise :

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

然而,一旦 promise 在服务中得到解决,指令似乎不知道 var1 的值已更改。我认为这将由 AngularJS 引擎处理。

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

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

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

最佳答案

在我看来,您只需要进行一次 then() 调用,并且使用 then() 是使用 Promise 的正确方法:

指令内部:

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

关于 promise 的一些旁注:

这是多余的:

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() 调用并不是世界上最美丽的景象。当对箭头函数的广泛支持到来时,我会很高兴。

关于AngularJS。在服务中解决 promise 后如何更新指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28116328/

相关文章:

javascript - 观察父元素上指令的 ngModel 值变化

javascript - Angular - 使用条件 $odd/$even 以及 ngClass 的 ng-repeated 属性

javascript - 如何在 Angular 中使用 Controller 定位 html 元素?

javascript - 当 catch 存在时,可能会出现未处理的 promise 拒绝

javascript - AngularJS ng-Keyup 可以传递按下哪个键吗?

ios - 为什么我在 Controller 代码之前执行 View 代码?

c# - 异常在异步代码块中被忽略

ios - for 循环内的 NSURLConnection 异步请求无法正确下载 NSData (Swift)

Javascript - 在 Websocket 上使用 promise ?

javascript - xmlhttprequest 在 JS 显示模块模式中使用 Promise