如何"递归AJAX回调”;在JavaScript工作中

How do "recursive AJAX callbacks" in JavaScript work?

本文关键字:JavaScript 工作中 回调 AJAX quot 递归 如何      更新时间:2023-09-26

我正在使用Github API来检索关于我的一个转发的数据,我遇到了回调函数和递归函数重叠的问题(如带有回调的递归函数)

以下是jsfiddle上的脚本以及以下内容:

(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);
        });
    });
}());

返回的JSON是博客(文件)或树(目录)。如果是树,则会再次调用walkTree函数。我不知道回调在这里会如何表现,也不知道如何将它(应该)返回的数据从函数中获取到最底层的最后一个块中。

有人能澄清一下我应该怎么做吗?

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

然后,在ajax调用完成后的某个时间,成功函数被调用,在您的情况下,回调函数被成功函数调用。重要的是要理解,成功函数是在makeAJAXCall()函数完成之后调用的。

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

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

  1. 直接在成功处理程序中
  2. 在成功处理程序调用的某个函数中,在您的情况下是回调函数

因此,从回调函数中调用return returnedJSON.data.content;对您没有任何好处。这只是返回到ajax基础设施的一些内部部分,而不做任何事情。这个回报值会掉在地板上并丢失。

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

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