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