我已经检查了有关承诺的答案数量,但我无法让我的代码工作(也许我在其他地方做了一些非常错误的事情)
一般来说,我正在使用 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,延迟 https://stackoverflow.com/questions/18673890/angularjs-promises-q-defer它应该有效)
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);
}
根据我的理解,最后一个 then 应该在对 signalRSvc.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!!
});
}
在嵌套中,结果数据很好(但当然解决承诺的顺序是混乱的)。
提前感谢您的帮助,因为我没有主意。