Ich versuche, durch eine Reihe von HAL/JSON-Ressourcen zu durchlaufen, die einen Baum von Elementen modelliert über hrefs verbunden und über HTTPS abgerufen. I.e. ein "Gegenstand" kann ein Urlaub oder ein anderer Zweig mit anderen Blättern sein. Ach, ich kann es nicht richtig machen. Die Durchquerung wird immer enden, d. H. Den Rückruf then() in der letzten Anweisung meines Codebeispiels treffen, bevor die vollständige Rekursion durchgeführt wurde. In der Tat bekomme ich nur die erste Schicht in Kindern zurück.Async HTTP (S) Traversal nur mit Node.js Promisses
Meine Frage: Was habe ich vermisst, um es richtig zu machen?
Ich lerne immer noch Nodejs, aber ich habe Versprechen in früheren Beispielen erfolgreich verwendet. Ich stelle die Frage hier, weil ich nur das Modul https und das integrierte Nodejs Zeug verwenden muss. Andere Beispiele verwenden oft andere Module und/oder lösen das Problem nicht, das ich habe.
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');
});