我已经检查了有关诺言的答案,但是我无法使我的代码正常工作(也许我在其他地方做错了什么)
通常,我正在使用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] 删除。
我来说两句