【发布时间】:2018-01-25 08:04:45
【问题描述】:
我有这个函数,它在异步获取数据时返回一个承诺。如您所见,该承诺 ($watchCollection) 的代码中有观察者,它会持续观察数据并为每次更改触发承诺的解析功能。
我无法测试 then 是否会为每个解析函数调用多次触发一次。这可能吗?
this.getGridDataAndMetaData = function(viewId) {
return new Promise(function(resolve, reject) {
dataStore.fetchView(viewId)
.then(function(viewEntity) {
var grid_groupement = viewEntity.descriptor.state ? viewEntity.descriptor.state.grid_groupement : undefined;
var dataStoreEntities = viewEntity.getEntityType().getEntities();
var dataStoreProperties = viewEntity.getEntityType().getProperties();
var gridDataAndMetaData;
$rootScope.$watchCollection(function() {
return dataStoreEntities;
},
function(newCollection, oldCollection) {
if (!angular.equals(newCollection, {}))
formatDataStoreEntities(angular.copy(newCollection), grid_groupement)
.then(function(data) {
gridDataAndMetaData = data;
if (lastNewProperties != undefined && !angular.equals(lastNewProperties, [])) {
data.viewEntity = viewEntity;
data.grid_groupement = grid_groupement;
data.properties = lastNewProperties;
resolve(data);
}
});
});
$rootScope.$watchCollection(function() {
return dataStoreProperties;
},
function(newProperties, oldProperties) {
lastNewProperties = angular.copy(newProperties);
if (gridDataAndMetaData != undefined && !angular.equals(gridDataAndMetaData.valuesIdsEntitiesTabFormat, {})) {
generateServiceTabs(newProperties, function() {
data.viewEntity = viewEntity;
data.grid_groupement = grid_groupement;
data.properties = lastNewProperties;
resolve(data);
});
}
});
}).catch(function(error) {
console.error('%c getGridDataAndMetaData :: dataStore.fetchView(viewId):: error : ' + JSON.stringify(error), 'background: red; color: white; display: block;');
reject(error);
});
});
}
【问题讨论】:
-
我已经用回调替换了承诺,我无法测试它是否会在每次数据更新(=观察者执行)时运行。我更喜欢回调而不是为可观察模式使用更多库
-
ES6 承诺不是 AngularJS 承诺。 AngularJS 通过提供自己的事件处理循环来修改正常的 JavaScript 流程。这将 JavaScript 拆分为经典和 AngularJS 执行上下文。只有在 AngularJS 执行上下文中应用的操作才能受益于 AngularJS 数据绑定、异常处理、属性监视等。使用 $q 服务承诺将
.then块带入 AngularJS 执行上下文。 -
不要在
.then块内使用观察者。它会导致内存泄漏。你想在这里完成什么? -
一个 Promise(Angular 或 JavaScript)只会被解决一次。一旦您调用了
resolve或reject,随后对它们中的任何一个的调用都将被完全忽略。您可能需要Observable,详情请参阅this question's answers。
标签: javascript angularjs promise