forループ内でajax応答を待つ必要があります。非同期ではなく同期呼び出しを行うことができたとしても、そのレベルの制御はできません。他の誰かのAPIを使用しており、そのAPIがeBayのJavascriptAPIを呼び出しています。
以下は私の2つの関数で、実際には同じクロージャ/オブジェクトのメソッドであり、それぞれのスコープにcategoryStackとcategoryMapがあります。本質的には、マップを再帰的に作成しようとしていますが、実際の再帰ではなく、管理にスタックを使用したいと考えています。
setInterval / setTimeoutでいくつかのバリエーションを試しましたが、常に2つの結果のいずれかが得られます。ループの1回の反復、または無限ループです。m_eBay.getChildCategoriesは、以下の2つの関数の2番目をコールバックとして指定し、正常に到達していることを確認したことに注意してください。
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;
}
}
}
}