【发布时间】:2010-12-17 13:41:39
【问题描述】:
我需要在 for 循环中等待 ajax 响应。如果可以的话,我会简单地进行同步调用而不是异步调用,但我没有那种级别的控制:我使用的是其他人的 API,而后者又调用了 eBay 的 Javascript API。
下面是我的两个函数,实际上是同一个闭包/对象上的方法,每个函数的范围内都有 categoryStack 和 categoryMap。本质上,我正在尝试递归地构建地图,尽管我想使用堆栈进行管理,而不是真正的递归。
我尝试了一些关于 setInterval/setTimeout 的变体,但我总是得到以下两种结果之一:循环的一次迭代或无限循环。请注意,m_eBay.getChildCategories 将下面两个函数中的第二个指定为回调,并且我已经确认我已经成功到达那里。
function getChildCategories() {
categoryStack.push(-1);
while (categoryStack.length > 0) {
catId = categoryStack.pop();
m_eBay.getChildCategories({
'success':getChildCategoriesSuccess,
'failure':getChildCategoriesFailure},
{'siteid':0, 'CategoryID':catId, 'IncludeSelector':'ChildCategories'}
);
/*
use response from getChildCategoriesSuccess to reset categoryStack
*/
}
}
function getChildCategoriesSuccess(data){
if (data.categoryCount > 0) {
var categoryObjs = data.categoryArray.category;
for (var i=0, n=categoryObjs.length; i<n; i++) {
var catObj = categoryObjs[i];
if (catObj.categoryID != -1) { //skip root
categoryStack.push(catObj.categoryID);
categoryMap[catObj.categoryName] = catObj.categoryID;
}
}
}
}
【问题讨论】:
-
我不认为没有递归就可以做到这一点。从本质上讲,递归变成了循环。
-
据我所知,使用堆栈始终是递归的替代方案。尽管递归可以在没有任何干预的情况下构建整个地图,但我仍然想知道递归何时完成。所以我实际上认为这是使用递归还是通过管理堆栈来实现的,这是一个有争议的问题,我认为,如果你不需要递归,就不要使用它。
标签: javascript ajax recursion loops sleep