0

Ich habe einen Grafikeditor, in dem der Benutzer die Option zum Erstellen eines Knotens hat. Es wird mit allen aktuell ausgewählten Knoten verbunden. Im Google-Dokument sieht es so aus, als ob ein Knoten (seine Zeichenfolgenbezeichnung) der durch Kommas getrennten Menge verbundener Etiketten zugeordnet ist. Also, einen Knoten hinzuzufügen, habe ich zunächst eine leere Karte Artikel erstellenAktualisieren von gerade erstellten kollaborativen Karteneinträgen

map.set(name, ""); 

und dann separat fügen Sie die angeschlossenen Elemente

if (map.get(a) == null) throw new Error("node " + a + " does not exist") // fails here 
if (map.get(b) == null) throw new Error("node " + b + " does not exist") 
map.set(a, a_connections) 
map.set(b, b_connections) 

Das Problem, dass map.get ist erkennt, dass der Knoten nicht hinzugefügt wird in die Karte noch. Es braucht etwas Zeit. Es scheint, dass die Operationen selbst innerhalb eines einzelnen JS-Clients (read-my-writes inconsistent) nicht blockierend sind. Wie soll ich damit arbeiten?

Ich habe diese Inkonsistenz festgestellt, wenn versucht wurde, zwei Verbindungen herzustellen (nur um zu erkennen, wenn Verbindungen fehlgeschlagen sind, weil es passieren kann, dass Verbindung verloren geht und alle meine Edits nicht an Server weitergeben und ich wollte den Benutzer darüber wissen).

Antwort

0

Diese page enthält einige Details zur Konfliktlösung und Dinge, die Sie tun können, damit Ihre Änderungen zusammen angewendet werden.

Ich bin ein wenig verwirrt von Ihrem Beispiel, was das Problem/erwartetes Verhalten ist.

Wenn Sie map.set ("foo", "") gefolgt von map.get ("foo") auf demselben Client innerhalb desselben synchronen Blocks eingeben, gibt das get immer das wieder, was Sie festgelegt haben.

Wenn Sie es aus verschiedenen synchronen Blöcken tun, aber auf demselben Client, wird get nur dann etwas anderes zurückgeben, wenn ein anderer Client den Wert von "foo" geändert hat.

Wenn Sie die Einstellung vornehmen und auf verschiedene Clients zugreifen, kann der Wert von "foo" beliebig lange dauern, um an den anderen Client weitergegeben zu werden. Sie sollten in der Lage sein, einen Listener zu registrieren, um festzustellen, wann er eingestellt ist.

Wenn Sie verfolgen möchten, wenn alle Änderungen beibehalten wurden, können Sie auf DocumentSaveStateChangedEvents

+0

Dank hören, ich kann es überprüfen. Aber ich verstehe nicht, welcher Konflikt hier auftreten kann. Ein anderer Client verwendete nur, um den "schmutzigen" Zustand anzuhören und zu bereinigen. Ich habe das 'DocumentStateChangedEvent' versucht. Das [einzige verfügbare Beispiel ist] (https://momeet.world-telephone.com/download/iptv/android-sdk-linux/extras/google/google_play_services/samples/drive/playground/src/com/google/android/ gms/drive/sample/realtimeplayground/PlaygroundDocumentActivity.java) 'mRealtimeDocument.addDocumentSaveStateChangedListener (mSaveStateListener'. –

+0

Aber Logging' mRealtimeDocument.addDocumentSaveStateChangedListener' ist undefiniert. Ich kann 'doc.getModel(). getRoot()' aus dem Dokument onFileLoad bekommen Ereignis, aber dieses Dokument hat keine addStateChangeListener –

+0

Ich denke, das ist, weil ich den gleichen Code für beide Echtzeit-Clients teilen.Eine solche Inkonsistenz tritt auf, wenn ich das Diagramm über verschiedene Browser-Registerkarten bearbeiten, wenn jede Webseite nur eine Dokumentverbindung herstellt. –