Hat der folgende JavaScript-Code undefiniertes Verhalten?
var resolve;
var head = { next: new Promise(r => resolve = r) };
function addData(d) {
resolve({
data: d,
next: new Promise(r => resolve = r)
});
}
schrieb ich den obigen Code etwas ähnliches zu verketteten Liste zu erreichen, während die Daten in der Liste asynchron geladen wird.
Der Kopf dieser "verknüpften Liste" ist head
. Jeder Knoten in der Liste hat zwei Felder, .data
und .next
, wie eine normale verknüpfte Liste. .next
ist ein Versprechen, das zum nächsten Knoten in der Liste aufgelöst wird.
Jedes Mal, wenn addData(...)
aufgerufen wird, wird das Feld .next
des letzten letzten Knotens in der Liste in einen neuen Knoten aufgelöst und somit zum neuen letzten Knoten.
Ich habe die Funktionalität des obigen Codes in Node.js verifiziert und es funktioniert wie erwartet. Hier ist der Code, den ich um das Verhalten zu überprüfen verwenden:
var resolve;
var head = { next: new Promise(r => resolve = r) };
function addData(d) { resolve({ data: d, next: new Promise(r => resolve = r) }); }
async function verify() {
while(true) {
head = await head.next;
console.log(head.data);
}
}
verify();
addData(1); // outputs: 1
addData(2); // outputs: 2
addData(3); // outputs: 3
Allerdings bin ich mir nicht sicher, ob es irgendwelche potenzielles Problem (Speicher, Effizienz) mit dieser Struktur. Auch ich bin besonders besorgt über diese Linie:
resolve({data: d, next: new Promise(r => resolve = r})
wo Entschlossenheit genannt wird und zugleich zugeordnet. Was sollte zuerst geschehen, Zuordnung oder Funktionsnamen Auflösung? Ist das ein undefiniertes Verhalten?
Vielen Dank!
Ob es funktioniert oder nicht, es ist sicher stumpf (schwer zu lesen und den Punkt des Codes zu verstehen). – jfriend00
@ jfriend00 Er würde nur die ganze Kette behalten, wenn er einen Verweis auf den Anfangskopf behielt, was er nicht tut. Natürlich ist es leicht falsch zu verstehen ... – Bergi
@Bergi - Ich hatte diesen Kommentar bereits gelöscht, weil ich festgestellt habe, dass das zu schwer zu verstehen ist, was vor sich geht (schlechter Code meiner Meinung nach aus diesem Grund). Aber das OP sagte "wie eine verknüpfte Liste", aber ich denke, es ist überhaupt keine verknüpfte Liste. Ich denke, es ist nur ein höherer Bereich des vorherigen Versprechens. Gibt es nicht einen viel, viel besseren Weg, dies zu tun, der nicht so stumpf ist und nicht die höher definierte Variable 'resolve' verwendet? – jfriend00