javascript - 多次调用[promise的]解析

标签 javascript angularjs promise

我有这个函数,它在异步获取数据时返回一个 promise 。正如您所看到的,该 Promise 的代码 ($watchCollection) 中有一些观察者,它们会持续观察数据并为每次更改触发 Promise 的解析函数。

我无法测试 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);
            });


    });

}

最佳答案

resolve 函数是 Promise 执行器函数的参数,最多执行一次。 Promise 只能实现一次。请注意,给定的 dataStore.fetchView(viewId) 返回一个 PromisePromise 构造函数不是必需的。

关于javascript - 多次调用[promise的]解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438194/

相关文章:

javascript - 构建真实世界的 AngularJS 应用程序,我应该如何在 html 中声明我的 Controller 。我需要在index.html中声明所有内容吗?

jquery - 如何获取 Angular js中的负载值

javascript - angularjs 使用指令更改 css 样式

javascript - 在返回函数变量之前如何等待 promise 完成?

javascript - 防止用户在 Netsuite 中使用标准/非自定义表单

javascript - Highcharts : cross symbol with fillColor

javascript - Promise 异常行为,执行顺序

javascript - 根据选项将 axios.get URL 传递到 axios.all

javascript - jQuery DataTables 复选框扩展无法在 IE 浏览器中正确检索所选数据

javascript - 为什么要在这个 var 声明中将这个变量赋值给它自己?