javascript回调未将数据推送到调用顶部

javascript回调未将数据推送到调用顶部,javascript,Javascript,我正在慢慢地学习如何使用回调,我遇到了麻烦。我认为下面的代码应该可以工作,但事实并非如此 据我所知,它并不像在最后碰到另一个“树”条目或输出任何东西时那样下降到递归函数中 我遇到的问题之一是for循环中的回调。我不确定是否有更好的方法:在调用回调之前,我只是使用了一个计数器来查看我是否处于循环的末尾 如果您能提供一些指导,我们将不胜感激 (function () { 'use strict'; var objectsList = []; function makeAJ

我正在慢慢地学习如何使用回调,我遇到了麻烦。我认为下面的代码应该可以工作,但事实并非如此

据我所知,它并不像在最后碰到另一个“树”条目或输出任何东西时那样下降到递归函数中

我遇到的问题之一是for循环中的回调。我不确定是否有更好的方法:在调用回调之前,我只是使用了一个计数器来查看我是否处于循环的末尾

如果您能提供一些指导,我们将不胜感激

(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返回