Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS嵌套承诺了一些问题_Angularjs_Closures_Promise - Fatal编程技术网

AngularJS嵌套承诺了一些问题

AngularJS嵌套承诺了一些问题,angularjs,closures,promise,Angularjs,Closures,Promise,我需要你们的帮助来解决这个问题,事实上,我还不知道如何在一些嵌套承诺中检索承诺结果,下面是我的代码 // service mainApp.factory('myService', ['CmisManager', '$q', 'ServiceCMIS', function(CmisManager, $q, ServiceCMIS) { get_detailFold: function(_objectId){ return S

我需要你们的帮助来解决这个问题,事实上,我还不知道如何在一些嵌套承诺中检索承诺结果,下面是我的代码

// service
mainApp.factory('myService',  ['CmisManager', '$q', 'ServiceCMIS', function(CmisManager, $q, ServiceCMIS) {        
            get_detailFold: function(_objectId){
                return ServiceCMIS.getDocumentProperties(_objectId)
                    .then(function(data){
                        var items = [] ;
                        var imgListe =  data.succinctProperties['tsi:image_liste'].split(';') ;

                        (function(imgListe){
                            for (var i=0; i<imgListe.length; i++) {
                                (function(index){
                                    var item = {} ;
                                    item.id = imgListe[index] ;
                                    return ServiceCMIS.getDocumentProperties(imgListe[index])
                                        .then(function(data){
                                            var contentStreamId = data.succinctProperties['cmis:contentStreamId'] ;
                                                return ServiceCMIS.getContentStreamDocumentURL(data[index], contentStreamId)
                                                    .then(function(data){
                                                    item.urlThumbnail = data ;
                                                    item.urlDetail = data ;
                                                    items.push(item) ;
                                        })
                                    })
                                })(i) ;
                            }
                            return items ;
                        })(imgListe) ;

                    })
                    .then(null, function(error){
                        return error;
                    }) ;
            }
        };
    }])
 }])            
// controleur
myService.get_detailFold(41946).then(function(data){
    $scope.datatest = data ;
}) ;
但是,我没有定义


提前感谢您的帮助

您应该真正利用
.map
.forEach
循环,以避免循环周围那些讨厌的闭包

也就是说,你的问题相当简单,你是从封闭的内部返回,而不是从封闭的外部返回

return items ;
})(imgListe) ;
从匿名调用的闭包函数返回,而不是从启动器返回:

})(imgListe) ;
return items ;
但是,您仍然没有按正确的顺序填充项目,因为它不会等待所有项目-为此,请使用等待承诺数组的
$q.all
。您的代码应该如下所示:

mainApp.factory('myService',  ['CmisManager', '$q', 'ServiceCMIS', function(CmisManager, $q, ServiceCMIS) {        
    //...
    get_detailFold: function(_objectId){
        return ServiceCMIS.getDocumentProperties(_objectId).then(function(data){
            var items = [] ;
            var imgList = data.succinctProperties['tsi:image_liste'].split(';');
            var ps = imgListe.map(function(img){
                return ServiceCMIS.getDocumentProperties(img).then(function(properties){
                    var contentStreamId = data.succinctProperties['cmis:contentStreamId'];
                    return ServiceCMIS.getContentStreamDocumentURL(img, contentStreamId);           
                }).then(function(data){
                    return { id:img, urlThumbnail: data, urlDetail: data };
                });
            });
            return $q.all(ps); // waits for all promises to resolve  
        }); // don't .catch here, let the other side handle failures
    }
}]);

作为参考,在调试模式下,我在item变量中正确地获得了所需的值。
mainApp.factory('myService',  ['CmisManager', '$q', 'ServiceCMIS', function(CmisManager, $q, ServiceCMIS) {        
    //...
    get_detailFold: function(_objectId){
        return ServiceCMIS.getDocumentProperties(_objectId).then(function(data){
            var items = [] ;
            var imgList = data.succinctProperties['tsi:image_liste'].split(';');
            var ps = imgListe.map(function(img){
                return ServiceCMIS.getDocumentProperties(img).then(function(properties){
                    var contentStreamId = data.succinctProperties['cmis:contentStreamId'];
                    return ServiceCMIS.getContentStreamDocumentURL(img, contentStreamId);           
                }).then(function(data){
                    return { id:img, urlThumbnail: data, urlDetail: data };
                });
            });
            return $q.all(ps); // waits for all promises to resolve  
        }); // don't .catch here, let the other side handle failures
    }
}]);