延迟对象不包含json对象中的精确值

时间:2014-11-19 10:27:54

标签: jquery json jquery-deferred

我正在创建一个JavaScript库。在那里我使用延迟方法进行异步调用。 但问题是,如果我记录输出json对象没有显示所有项目。但是,如果我展开对象,那么它将显示实际值。看下面的截图。 enter image description here

在此console.log中显示subFolders对象最初包含0个元素,但如果我展开对象,则子文件包含两个元素。此输出对象来自多个异步调用。以下是我的代码

RESTQueries.getFilesFromFolders = function(){
    var execute = function(libraryName){
        var libraryItems={rootFolder:[],subFolders:[]};
        var deferred = $.Deferred();
        var _url = makeProperUrl();
        var itemsInRootFolder = getItemsFromFolder(libraryName,'files');
        itemsInRootFolder.then(function(data){
            var tempArray = [];
            if(typeof(data.d.results)!='undefined' && data.d.results.length>0)
            {

                for(var i =0;i<data.d.results.length;i++)
                {

                    tempArray.push({"name":data.d.results[i].Name});

                }
            }
            libraryItems.rootFolder.push(tempArray);
        }).then(function(){
            var subFolders = getItemsFromFolder(libraryName,'folders');
            subFolders.then(function(data){
                for(var item in data.d.results){
                    var fName = data.d.results[item].Name;
                    if(fName!='Forms')
                    {
                        var subFolderItems = getItemsFromFolder(libraryName+"/"+fName ,'files');
                        subFolderItems.then(function(subItems,link){
                            var actualFolderName = link.split("/")[1];
                            var tempArray={}; 
                            var tempArray2 = [];
                            for(var i=0;i<subItems.d.results.length;i++){
                                tempArray2.push({"name":subItems.d.results[i].Name});
                            }
                            tempArray[actualFolderName]=tempArray2;
                            tempArray2="";
                            libraryItems.subFolders.push(tempArray);                            
                        });
                    }
                }
            });         
        }).then(function(){
            deferred.resolve(libraryItems);
        });
        return deferred;
    };
    return{
        execute:execute
    }
}(); 

我正在执行此功能,如

RESTQueries.getFilesFromFolders.execute('HelpDocuments').then(function(data){
            console.log(data);
        },
        function(err){
            console.log(err);
        }); 

为什么json对象的行为如此?我在哪里做错了?

2 个答案:

答案 0 :(得分:0)

检查此代码是否适合您

RESTQueries.getFilesFromFolders = function(){
    var execute = function(libraryName){
        var libraryItems={rootFolder:[],subFolders:[]};
        var deferred = $.Deferred();
        var _url = makeProperUrl();
        var itemsInRootFolder = getItemsFromFolder(libraryName,'files');
        itemsInRootFolder.then(function(data){
            var tempArray = [];
            if(typeof(data.d.results)!='undefined' && data.d.results.length>0)
            {

                for(var i =0;i<data.d.results.length;i++)
                {

                    tempArray.push({"name":data.d.results[i].Name});

                }
            }
            libraryItems.rootFolder.push(tempArray);
            

         var subFolders = getItemsFromFolder(libraryName,'folders');
                    subFolders.then(function(data){
                        for(var item in data.d.results){
                            var fName = data.d.results[item].Name;
                            if(fName!='Forms')
                            {
                                var subFolderItems = getItemsFromFolder(libraryName+"/"+fName ,'files');
                                subFolderItems.then(function(subItems,link){
                                    var actualFolderName = link.split("/")[1];
                                    var tempArray={}; 
                                    var tempArray2 = [];
                                    for(var i=0;i<subItems.d.results.length;i++){
                                        tempArray2.push({"name":subItems.d.results[i].Name});
                                    }
                                    tempArray[actualFolderName]=tempArray2;
                                    tempArray2="";
                                    libraryItems.subFolders.push(tempArray);   
                                    deferred.resolve(libraryItems);
                                });
                            }
                        }
                    });             
            
            
            
        });
        return deferred;
    };
    return{
        execute:execute
    }
}(); 

答案 1 :(得分:0)

我不知道控制台可以这样做。也许它在其他浏览器中更好。

我们无法修复控制台,但我们可以修复代码,这需要一些工作来清除Deferred anti-pattern,更重要的是,要确认两个内部getItemsFromFolder()调用的异步。 / p>

模式并不是最简单的,但你应该得到这样的结论:

RESTQueries.getFilesFromFolders = function(){
    var execute = function(libraryName) {
        return getItemsFromFolder(libraryName, 'files').then(function(data) {
            var tempArray;
            if(data.d && data.d.results) {
                tempArray = $.map(data.d.results, function(r) {
                    return { 'name': r.Name };
                });
            }
            return { rootFolder: [tempArray] || [] };
        }).then(function(libraryItems) {
            return getItemsFromFolder(libraryName, 'folders').then(function(data) {
                var promises = [];
                if(data.d && data.d.results) {
                    $.each(data.d.results, function(r) {
                        var fName = r.Name;
                        if(fName != 'Forms') {
                            promises.push(getItemsFromFolder(libraryName + "/" + fName, 'files').then(function(subItems, link) {
                                if(subItems.d && subItems.d.results) {
                                    var tempObj = {};
                                    tempObj[link.split("/")[1]] = $.map(subItems.d.results, function(r) {
                                        return { 'name': r.Name };
                                    });
                                    return tempObj;
                                }
                            }));
                        }
                    });
                }
                return $.when.apply(null, promises).then(function() {
                    return $.extend(libraryItems, {
                        subFolders: Array.prototype.slice.apply(arguments).filter(function(p) {
                            return !!p; //filter out any nulls
                        })
                    });
                });
            });
        });
    };
    return {
        execute:execute
    }
}();

我制作了一堆mod并且很可能犯了错误,所以要准备好做一些调试。