Самое простое решение, которое я нашел, это сделать следующее:
var epicLevelStories = {
key: 'epics',
type: 'hierarchicalrequirement',
fetch: 'FormattedID,Name,ObjectID,Release'
query: epicQuery,
order: 'FormattedID'
};
var epicLevel2Stories = {
key: 'epiclevel2',
placeholder: '${epics.children?fetch=Name,FormattedID,Parent,Release}'
};
var epicLevel3Stories = {
key: 'epiclevel3',
placeholder: '${epiclevel2.children?fetch=Name,FormattedID,Parent,Release}'
};
var queryArray = [epicLevelStories, epicLevel2Stories, epicLevel3Stories];
rallyDataSource.findAll(queryArray, doStuffWithResults);
Как только вы получите набор результатов (epiclevel #), в котором нет записей, вы знаете, что достигли нижней части дерева.
Я предполагаю, что если в epiclevel3 еще есть истории, вы можете создать новый массив запросов для следующих 3 уровней и рекурсивно вызвать тот же метод doStuffWithResults. Просто мысль. Я не проверял это.