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