如何"递归AJAX回调”;在JavaScript工作中
How do "recursive AJAX callbacks" in JavaScript work?
我正在使用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调用完成后的某个时间,成功函数被调用,在您的情况下,回调函数被成功函数调用。重要的是要理解,成功函数是在makeAJAXCall()
函数完成之后调用的。
因此,您无法从makeAJAXCall()
函数返回ajax数据,因为还不知道该函数何时返回。
事实上,只有两个地方可以使用ajax调用的结果:
- 直接在成功处理程序中
- 在成功处理程序调用的某个函数中,在您的情况下是回调函数
因此,从回调函数中调用return returnedJSON.data.content;
对您没有任何好处。这只是返回到ajax基础设施的一些内部部分,而不做任何事情。这个回报值会掉在地板上并丢失。
相反,您需要将想要使用returnedJSON.data.content
的任何代码放在回调函数中(或通过函数调用将其传递给另一个函数)。
Ajax是异步的。这意味着您在使用ajax时无法进行正常的顺序编程。相反,您必须执行事件驱动的编程,在这种情况下,事件是成功完成ajax调用时调用的回调。所有使用这些ajax结果的工作都需要从成功处理程序或从中调用的回调开始
相关文章:
- For循环在Javascript函数中无法正常工作
- onclick'放在JavaScript脚本中时无法工作
- JAVASCRIPT:Toggle中的Toggle不工作问题
- 一个Javascript函数中的错误导致其他函数停止工作
- 为什么即使对象未在 javascript 代码中定义,此代码也能正常工作
- g:message 在 Javascript / jQuery 中带有参数的参数无法按预期工作
- 如何让 CSS 类在我的 Javascript 文件中工作
- JavaScript函数中的相邻圆括号是如何工作的,这在哪里有记录
- 如何让常量变量在JavaScript代码中动态工作
- 这个jquery在html中工作,但在javascript文件中不工作,jquery 2.1.4文件源也不工作
- 为什么不'在CasperJS中没有简单的JavaScript工作
- 如何"递归AJAX回调”;在JavaScript工作中
- 页面没有'在带有表单的JavaScript代码中不能很好地工作
- 如何让textContent在InternetExplorer8(JavaScript)中工作
- 如何使用javascript?_中的.protype(?)使foo().bake()与foo.back()一样工作
- 全局变量如何在两个javascript文件中的Function中的javascript中工作
- AngularJS过滤器和ng模型如何在JavaScript环境中工作
- NaN消息,即使在递归函数中所有的Javascript工作似乎都很好
- Canvas可以在HTML文件中工作,但不能在javascript文件中工作
- 从html文本框中获取输入,然后将其放入Javascript变量中不工作