javascript回调未将数据推送到调用顶部
我正在慢慢地学习如何使用回调,我遇到了麻烦。我认为下面的代码应该可以工作,但事实并非如此 据我所知,它并不像在最后碰到另一个“树”条目或输出任何东西时那样下降到递归函数中 我遇到的问题之一是for循环中的回调。我不确定是否有更好的方法:在调用回调之前,我只是使用了一个计数器来查看我是否处于循环的末尾 如果您能提供一些指导,我们将不胜感激javascript回调未将数据推送到调用顶部,javascript,Javascript,我正在慢慢地学习如何使用回调,我遇到了麻烦。我认为下面的代码应该可以工作,但事实并非如此 据我所知,它并不像在最后碰到另一个“树”条目或输出任何东西时那样下降到递归函数中 我遇到的问题之一是for循环中的回调。我不确定是否有更好的方法:在调用回调之前,我只是使用了一个计数器来查看我是否处于循环的末尾 如果您能提供一些指导,我们将不胜感激 (function () { 'use strict'; var objectsList = []; function makeAJ
(function () {
'use strict';
var objectsList = [];
function makeAJAXCall(hash, cb) {
$.ajaxSetup({
accept: 'application/vnd.github.raw',
dataType: 'jsonp'
});
$.ajax({
url: hash,
success: function (json) {
if (cb) {
cb(json);
}
},
error: function (error) {
console.error(error);
throw error;
}
});
}
function parseBlob(hash, cb) {
makeAJAXCall(hash, function (returnedJSON) { // no loop as only one entry
if (cb) {
cb(returnedJSON.data);
}
});
}
function complete(cb, loopLength, treeContents) {
concole.info(loopLength);
if (cb && loopLength === 0) {
objectsList.push(treeContents);
cb();
}
}
function parseTree(hash, treeName, cb) {
var treeContents = {'tree': treeName, 'blobs': []}, loopLength, i, entry;
var tree = 'https://api.github.com/repos/myusername/SVG-Shapes/git/trees/' + hash;
makeAJAXCall(tree, function (returnedJSON) {
loopLength = returnedJSON.data.tree.length;
for (i = 0; i < returnedJSON.data.tree.length; i += 1) {
entry = returnedJSON.data.tree[i];
if (entry.type === 'blob') {
if (entry.path.slice(-4) === '.svg') { // we only want the svg images not the ignore file and README etc
parseBlob(entry.url, function (json) {
treeContents.blobs.push(json.content);
loopLength -= 1;
complete(hash, loopLength, cb);
});
}
} else if (entry.type === 'tree') {
parseTree(entry.sha, entry.path, function () {console.info(objectsList);});
}
}
});
}
$(document).ready(function () {
parseTree('master', 'master', function () { // master to start at the top and work our way down
console.info(objectsList);
});
});
}());
(函数(){
"严格使用",;
var objectsList=[];
函数makeAJAXCall(散列,cb){
$.ajaxSetup({
接受:“application/vnd.github.raw”,
数据类型:“jsonp”
});
$.ajax({
url:hash,
成功:函数(json){
如果(cb){
cb(json);
}
},
错误:函数(错误){
控制台错误(error);
投掷误差;
}
});
}
函数parseBlob(散列,cb){
makeAJAXCall(散列,函数(returnedJSON){//no循环作为一个条目
如果(cb){
cb(returnedJSON.data);
}
});
}
功能完成(cb、loopLength、treeContents){
concole.info(循环长度);
如果(cb&&loopLength==0){
objectsList.push(树内容);
cb();
}
}
函数parseTree(哈希、树名、cb){
var treeContents={'tree':treeName'blobs':[]},loopLength,i,entry;
var树https://api.github.com/repos/myusername/SVG-Shapes/git/trees/“+散列;
makeAJAXCall(树,函数(returnedJSON){
loopLength=returnedJSON.data.tree.length;
对于(i=0;i
您的递归将无法正常工作,因为您收集blob数据的变量treeContents
是递归函数的局部变量,因此每次调用parseTree()
时,它都会被新建和销毁。它不会积累数据。您必须在parseTree()
函数的作用域之外创建此变量,以便此变量的单个实例可以在一次调用到下一次调用之间运行,并且可以在其中正确累积数据
有几种方法可以解决此问题:
treeContents
的当前状态传递到parseTree()
函数中treeContents
变量的局部函数李>
treeContents
变量设置为全局变量function parseTree(topHash, topTreeName, topCb) {
var treeContents = {'tree': toptreeName, 'blobs': []};
function parse(hash, treeName, cb) {
var loopLength, i, entry;
var tree = 'https://api.github.com/repos/myusername/SVG-Shapes/git/trees/' + hash;
makeAJAXCall(tree, function (returnedJSON) {
loopLength = returnedJSON.data.tree.length;
for (i = 0; i < returnedJSON.data.tree.length; i += 1) {
entry = returnedJSON.data.tree[i];
if (entry.type === 'blob') {
if (entry.path.slice(-4) === '.svg') { // we only want the svg images not the ignore file and README etc
parseBlob(entry.url, function (json) {
treeContents.blobs.push(json.content);
loopLength -= 1;
complete(hash, loopLength, cb);
});
}
} else if (entry.type === 'tree') {
parse(entry.sha, entry.path, function () {console.info(objectsList);});
}
}
});
}
parse(topHash, topTreeName, topCb);
}
函数解析树(topHash、topTreeName、topCb){
var treeContents={'tree':toptreeName'blobs':[]};
函数解析(哈希、树名、cb){
var loopLength,i,条目;
var树https://api.github.com/repos/myusername/SVG-Shapes/git/trees/“+散列;
makeAJAXCall(树,函数(returnedJSON){
loopLength=returnedJSON.data.tree.length;
对于(i=0;i
假设ajax调用是异步的,您仍然需要找到一种方法来知道何时完成了所有解析,并调用将treeContents
数据传递给的某个函数,否则,该数据对任何其他函数都不可用。由于ajax调用的异步性质,它不能简单地从parseTree返回