我正在创建一个JavaScript库。在那里我使用延迟方法进行异步调用。 但问题是,如果我记录输出json对象没有显示所有项目。但是,如果我展开对象,那么它将显示实际值。看下面的截图。
在此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对象的行为如此?我在哪里做错了?
答案 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并且很可能犯了错误,所以要准备好做一些调试。