“怎么做?”;递归AJAX回调";在JavaScript工作中?

“怎么做?”;递归AJAX回调";在JavaScript工作中?,javascript,ajax,Javascript,Ajax,我正在使用Github API检索关于我的一个repo的数据,我遇到了回调函数和递归函数重叠的问题(比如在连接回调的递归函数中) 以及以下各项: (function () { 'use strict'; function makeAJAXCall(hash, cb) { $.ajaxSetup({ accept: 'application/vnd.github.raw', dataType: 'jsonp'

我正在使用Github API检索关于我的一个repo的数据,我遇到了回调函数和递归函数重叠的问题(比如在连接回调的递归函数中)

以及以下各项:

(function () {
    'use strict';

    function makeAJAXCall(hash, cb) {
        $.ajaxSetup({
            accept: 'application/vnd.github.raw',
            dataType: 'jsonp'
        });

        $.ajax({
            url: hash,
            success: function (json) {
                //console.info(json);
                // Time for callback to be executed
                if (cb) {
                    cb(json);
                }
            },
            error: function (error) {
                console.error(error);
                // an error happened, check it out.
                throw error;
            }
        });
    }

    function parseBlob(hash) {
        return makeAJAXCall(hash, function (returnedJSON) {  // no loop as only one entry
            console.log(returnedJSON.data);
            return returnedJSON.data.content;
        });
    }

    function walkTree(hash) {
        var tree = 'https://api.github.com/repos/myusername/SVG-Shapes/git/trees/' + hash;
        return makeAJAXCall(tree, function (objectedJSON) {
            var objectList = [], i, entry;
            for (i = 0;  i < objectedJSON.data.tree.length; i += 1) {
                entry = objectedJSON.data.tree[i];
                //console.debug(entry);
                if (entry.type === 'blob') {
                    if (entry.path.slice(-4) === '.svg') {     // we only want the svg images not the ignore file and README etc
                        //console.info(entry.path)
                        objectList.push(parseBlob(entry.url));
                    }
                } else if (entry.type === 'tree') {
                    objectList.push(walkTree(entry.sha));
                }
            }
            if (cb) {
                console.log(objectList);
                cb(objectList);
            }
            return objectList;
        });
    }

    $(document).ready(function () {
        var returnedObjects = walkTree('master', function (objects) {     // master to start at the top and work our way down
            console.info(objects);
        });
    });
}());
(函数(){
"严格使用",;
函数makeAJAXCall(散列,cb){
$.ajaxSetup({
接受:“application/vnd.github.raw”,
数据类型:“jsonp”
});
$.ajax({
url:hash,
成功:函数(json){
//console.info(json);
//执行回调的时间
如果(cb){
cb(json);
}
},
错误:函数(错误){
控制台错误(error);
//发生错误,请检查它。
投掷误差;
}
});
}
函数parseBlob(散列){
返回makeAJAXCall(散列,函数(returnedJSON){//no循环作为一个条目
log(returnedJSON.data);
返回returnedJSON.data.content;
});
}
函数walkTree(散列){
var树https://api.github.com/repos/myusername/SVG-Shapes/git/trees/“+散列;
返回makeAJAXCall(树,函数(objectedJSON){
var objectList=[],i,条目;
对于(i=0;i
返回的JSON是blog(文件)或tree(目录)。如果是树,则再次调用walkTree函数。我不理解回调函数在这里的行为,以及如何从函数中获取它应该返回的数据,并将其放入最底层的最后一个块中


有人能解释一下我应该怎么做吗?

Ajax调用通常是异步的。这意味着当您进行ajax调用时,它只是启动ajax调用,并在一段时间后完成。同时,ajax调用启动后的其余代码将一直运行到完成

然后,在ajax调用完成后的某个时候,success函数被调用,在您的例子中,回调函数被success函数调用。了解success函数是在
makeAJAXCall()
函数完成之后调用的,这一点很重要

因此,您无法从
makeAJAXCall()
函数返回ajax数据,因为该函数何时返回还不知道

事实上,您可以使用ajax调用结果的仅有两个地方是:

  • 直接在成功处理程序中
  • 在成功处理程序调用的某个函数中,在本例中,它调用回调函数
  • 因此,
    返回returnedJSON.data.content对您没有好处。这只是返回到ajax基础架构的某些内部部分,什么也不做。该返回值将被丢弃在地板上并丢失

    相反,您需要将任何代码想要使用的
    returnedJSON.data.content
    放在回调函数中(或者通过函数调用将其传递给另一个函数)


    Ajax是异步的。这意味着在使用ajax时无法进行常规的顺序编程。相反,您必须进行事件驱动编程,在这种情况下,事件是成功完成ajax调用后调用的回调。所有使用这些ajax结果的工作都需要从成功处理程序或从中调用的回调开始。

    ajax调用通常是异步的。这意味着当您进行ajax调用时,它只是启动ajax调用,并在一段时间后完成。同时,ajax调用启动后的其余代码将一直运行到完成

    然后,在ajax调用完成后的某个时候,success函数被调用,在您的例子中,回调函数被success函数调用。了解success函数是在
    makeAJAXCall()
    函数完成之后调用的,这一点很重要

    因此,您无法从
    makeAJAXCall()
    函数返回ajax数据,因为该函数何时返回还不知道

    事实上,您可以使用ajax调用结果的仅有两个地方是:

  • 直接在成功处理程序中
  • 在成功处理程序调用的某个函数中,在本例中,它调用回调函数
  • 因此,
    返回returnedJSON.data.content对您没有好处。这只是返回到ajax基础架构的某些内部部分,什么也不做。该返回值将被丢弃在地板上并丢失

    相反,您需要将任何代码想要使用的
    returnedJSON.data.content
    放在回调函数中(或者通过函数调用将其传递给另一个函数)

    Ajax是异步的。这意味着你不能做正常的sequ