Я пытаюсь пройти через кучу ресурсов HAL/JSON, которые моделируют дерево элементов, связанных через hrefs и извлекаемых через https. То есть «элементом» может быть отпуск или другая ветка с другими листьями. Увы, я не могу понять. Обход всегда будет завершен, т. Е. Ударит обратный вызов then() в последнем примере моего примера кода, прежде чем будет выполнена полная рекурсия. По сути, я получаю только первый слой назад у детей.Async HTTP (S) Обход только с использованием Node.js Promisses
Мой вопрос: что я пропустил, чтобы понять это правильно?
Я все еще изучаю Nodejs, но я успешно использовал обещания в более ранних примерах. Я задаю этот вопрос здесь, потому что я обязан использовать только модуль https и интегрированный материал Nodejs. Другие примеры часто используют другие модули и/или не решают проблемы, которые у меня есть.
var traverse = function(rootItemUrl, depth, children) {
var deferred = Promise.defer();
var itemUrl = rootItemUrl;
var options = {
'path' : itemUrl
, 'host' : "<host>"
, 'method' : 'GET'
, 'headers' : {
'Content-Type' : 'application/json'
, 'Accept' : 'application/json'
, 'Forwarded' : 'proto=https;host=<host>'
, 'Cookie' : options_.headers['Cookie']
}
};
https.get(options, onItemResultResponse);
function onItemResultResponse(itemResultResponse) {
var body = [];
itemResultResponse.on('data', function onDataChunk(data) {
body.push(data);
});
itemResultResponse.on('end', onItemResultData);
itemResultResponse.on('error', onRequestItemsError);
function onRequestItemsError(e) {
console.log('Get items failed for <'+rootItemUrl+'>.');
deferred.reject();
}
function onItemResultData() {
var items = [];
var itemResult = JSON.parse(Buffer.concat(body).toString());
var embedded = itemResult._embedded;
var collection = embedded ? embedded['collection'] : undefined;
if(collection) {
var itemsObject = collection._links['item'];
if(itemsObject) {
if(itemsObject.length) {
for(var i = 0; i < itemsObject.length; ++i) {
items.push(itemsObject[i].href);
}
} else {
items.push(itemsObject.href);
}
}
}
var type = itemResult.base.type;
var name = itemResult.common.name;
var text = repeatChar(depth, '\t') + ('folder' === type ? '- (folder) ' : '')+ 'depth: '+depth+' '+name;
children.push(text);
//console.log(text);
if(items.length) {
for (var j = 0; j < items.length; ++j) {
traverse(items[j], depth + 1, children)
.then(function() {deferred.resolve(depth);});
}
} else {
deferred.resolve(depth);
}
}
}
return deferred.promise;
};
var children = [];
traverse(rootItemUrl, 0, children)
.then(function toConsole(depth) {
// >> Alas I hit this point too early <<
console.log(children);
console.log('End');
});