AngularJS承诺$ q.all和SignalR

迷笛

我已经检查了有关诺言的答案,但是我无法使我的代码正常工作(也许我在其他地方做错了什么)

通常,我正在使用AngularJS和SignalR进行小型测试应用程序。我有如下的signalR服务:

(function () {
'use strict';

var serviceId = 'signalRSvc';
angular.module('app').service(serviceId, ['$rootScope', signalrcontext]);

function signalrcontext( $rootScope) {
    var performanceHub = null;
    var connection = null;        

    var service = {
        initialize: initialize,
        getPerformanceCounters: getPerformanceCounters,
        getAllValues: getAllValues
    };

    return service;

    function initialize() {
        connection = $.connection;

        performanceHub = connection.webServicePerformanceHub;
        connection.hub.logging = true;

        performanceHub.client.updatePerformanceData = function(performanceData) {
            $rootScope.$emit("updatePerformanceData", performanceData);
        };

        return connection.hub.start();
    };

    function getPerformanceCounters() {
        return performanceHub.server.getPerformanceCounters();
    };

    function getAllValues(id) {
        return performanceHub.server.getAllValues(id);
    };
}
})();

我想做的是初始化SignalR,然后执行getPerformanceCounters()方法,该方法将下载要渲染的计数器列表(作为对象数组返回),然后对于每个计数器,我想获取数据,然后问题开始了。根据MS文档,SignalR代理方法正在返回承诺。我已经写了这段代码,但是我不知道为什么它不能在步骤getAllValues上工作(根据这个答案,AngularJS Promises,$ q,推迟它应该工作)

   function initSignalR() {
        return signalRSvc.initialize().then(function() {                
            return signalRSvc.getPerformanceCounters();
        }).then(function(configurations) {
            log('performance counters configuration downloaded');
            return getAllValues(configurations);
        }).then(function (resultData) {
            vm.resultData = resultData;
        });
    }

    function getAllValues(configurations) {
        var promises = new Array();

        angular.forEach(configurations, function(configuration) {
            promises.push(signalRSvc.getAllValues(configuration.Id));
        });

        return $q.all(promises);
    }

以我的理解,最后对信号RSvc.getAllValues的所有“调用”都应完成,并且resultData应该包含从那些承诺返回的对象数组时,应该执行最后一个。取而代之的是,我得到了一些甚至不是数组的垃圾。

出乎意料的(当然对我来说)当我做这样的事情时

    function getAllValues(configurations) {
        var promises = new Array();

        angular.forEach(configurations, function(configuration) {
            promises.push(signalRSvc.getAllValues(configuration.Id));
        });

        return $q.all(promises).then(function(resultData) {  
           //here result data is fine!!
        });
    }

在嵌套中,结果数据就可以了(但是,解决承诺的顺序很混乱)。

由于我没有主意,请先谢谢您的帮助。

迷笛

看来问题似乎与SingalR返回的承诺有关(我的团队同事发现了这一点)。SignalR返回的jQuery Promise在所有情况下都不与AngularJS Promise“兼容”。解决方案是用$ q.when包装来自signalR代理的方法现在一切正常。

固定代码(仍然包含其他一些与SignalR相关的问题)

.....

return service;

function initialize() {
    connection = $.connection;

    performanceHub = connection.webServicePerformanceHub;
    connection.hub.logging = true;

    performanceHub.client.updatePerformanceData = function(performanceData) {
        $rootScope.$emit("updatePerformanceData", performanceData);
    };

    return $q.when(connection.hub.start();
};

function getPerformanceCounters() {
    return $q.when(performanceHub.server.getPerformanceCounters());
};

function getAllValues(id) {
    return $q.when(performanceHub.server.getAllValues(id));
};
.....

以前不起作用的Promise链现在可以正常工作

function initSignalR() {
    return signalRSvc.initialize().then(function () {
        return signalRSvc.getPerformanceCounters();
    }).then(function (configurations) {
        chartConfigurations = configurations;                
        return getAllValues(configurations);
    }).then(function (chartData) {
        angular.forEach(chartData, function(value, key) {
        chartConfigurations[key].chartData = convertToChartDataset(value);
        chartConfigurations[key].options = {
            animation: false
            };
        });

        vm.configurations = chartConfigurations;
    });
}

function getAllValues(configurations) {
    var promises = [];

    $.each(configurations, function (index, value) {
        promises.push(signalRSvc.getAllValues(value.Id));
    })

    return $q.all(promises);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AngularJS和Q.fcall

来自分类Dev

如何处理可能是angularjs中$ q承诺的对象?

来自分类Dev

AngularJS $ q.all和多个$ q.defer

来自分类Dev

在AngularJS中处理$ q.all和promises时出错

来自分类Dev

在angularjs中计算待处理的$ q承诺

来自分类Dev

$ q.all和嵌套承诺

来自分类Dev

单元测试angularjs $ q.all-承诺永远不会完成

来自分类Dev

AngularJS-为什么用$ http承诺($ q)?

来自分类Dev

在承诺链中容纳Q.all

来自分类Dev

AngularJS验证和承诺

来自分类Dev

承诺:具有同步和异步功能的q.all()

来自分类Dev

带有$ q的AngularJS执行顺序-链式承诺

来自分类Dev

Q库(javascript)-使用Q.all()在承诺中处理q.reject()

来自分类Dev

angularjs $ q和$ http关于承诺

来自分类Dev

承诺与angularJS和Typescript

来自分类Dev

承诺q.all结算为q.reduce

来自分类Dev

angularJS + express中带有$ q.all的重复响应承诺

来自分类Dev

AngularJS $ q承诺无法按预期工作

来自分类Dev

AngularJS承诺$ q.all和SignalR

来自分类Dev

AngularJS和Q.fcall

来自分类Dev

Q承诺传播错误和异常

来自分类Dev

在angularjs中计算待处理的$ q承诺

来自分类Dev

AngularJS,间谍和兑现承诺

来自分类Dev

AngularJS-$ q.all不以同步方式履行承诺

来自分类Dev

AngularJS验证和承诺

来自分类Dev

在承诺链中容纳Q.all

来自分类Dev

q.all()进行重复的ajax调用(Angularjs,$ http,$ q)

来自分类Dev

angularjs在$ q.all中返回另一个承诺

来自分类Dev

AngularJs $q.all 使用