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

Jquery 延迟对象在json对象中不包含精确值,jquery,json,jquery-deferred,Jquery,Json,Jquery Deferred,我正在创建一个javascript库。因为我对异步调用使用了延迟方法。 但问题是,如果我记录输出json对象并没有显示所有项目。但如果我展开对象,它就会显示实际值。请看下面的屏幕截图。 在此console.log中,显示子文件夹对象最初包含0个元素,但如果展开该对象,则子文件夹将包含两个元素。此输出对象来自多个异步调用。下面是我的代码 RESTQueries.getFilesFromFolders = function(){ var execute = function(library

我正在创建一个javascript库。因为我对异步调用使用了延迟方法。 但问题是,如果我记录输出json对象并没有显示所有项目。但如果我展开对象,它就会显示实际值。请看下面的屏幕截图。

在此
console.log中,显示子文件夹对象最初包含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
    }
}(); 

为什么json对象的行为是这样的?我哪里出错了?

检查此代码是否适用于您

RESTQueries.getFilesFromFolders=function(){
var execute=函数(libraryName){
var libraryItems={rootFolder:[],子文件夹:[]};
var deferred=$.deferred();
var_url=makeProperUrl();
var itemsinootfolder=getItemsFromFolder(libraryName,'files');
itemsInRootFolder.then(函数(数据){
var tempArray=[];
if(typeof(data.d.results)!=“未定义”和&data.d.results.length>0)
{

对于(var i=0;i我不知道控制台可以这样做。也许在其他浏览器中更好

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

模式不是最简单的,但最终应该是这样的:

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,很可能犯了错误,所以请准备好进行一些调试。

之前我也用这种方式尝试过。结果没有任何变化,不仅出现在控制台中。如果我尝试查找长度,如
console.log(data.subFolders.length);
然后它显示的是
0
而不是2当长度实际为零时,这并不奇怪。令人惊讶的是,控制台应该在其展开和未展开的表示形式中同时报告长度0和长度2。并且,与问题中的代码一样,data.subFolders.length在bot中应该为零原因是内部
getItemsFromFolder()的异步
在解析延迟的对象时不考虑调用。你没有说你是否尝试过我的代码。我对使用你的代码感到困惑。但我将尝试实现这一点。我认为你没有返回延迟的对象!!你只是在
$中返回json对象。when()
函数的
参数是从哪里来的
变量?您指的是
数组.prototype.slice.apply(promises)
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
    }
}();