Daten aus Promise -> [object Promise] wie zu lesen ?

  • Hallo,


    mein erster Prost ... Danke für die Aufnahme ....


    ich fülle in eine Indexed DB Daten in JSON Form.

    Diese möchte ich nun updaten.

    Dazu habe ich aus einem Youtube eine funktion get_record(key)

    Diese gibt die Daten wenn sie gefunden werden zurück.

    Wenn ich mir die Daten in der Funktion anzeigen lassen bekomme ich das JSON angezeigt.

    Wenn ich diese dann zurück gebe kommt dort dann immer nur [object Promise]

    Ich möchte diese daten aber

    a) sehen

    b) verändern


    Hier mein Code:


    Code
    1. let savetodb = new Promise(function(resolve,reject){
    2. let processedResponse = get_record(key);
    3. if (processedResponse === false) {
    4. return resolve("false") }
    5. else {
    6. return resolve("true")
    7. }
    8. });
    9. console.log('test 2 ' + savetodb);

    Das Ergebnis ist

    test 2 [object Promise]


    während wenn ich das selbe in der function mache kommt dort

    Aufruf:

    console.log('test 2 ', event.target.data);

    Ausgabe:

    test 2 {key:"123", Name: "Caddy"}



    Hier habe ich im Grunde 2 Fragen


    1) wie kann ich ausserhalb der Function den JSON anzeigen ? stringify klappt leider nicht

    2) wenn ich es dann anzeigen kann würde ich es gerne erweitern

    vorher {key:"123", name: "Caddy"}

    nachher {key:"123", name: "Caddy", Member: true}


    Ich hoffe, ich konnte es verständlich zu erklären.


    Danke Caddy

  • Hast du Dir die Grundlagen einer Promise durchgelesen? Verstehst du was eine Promise ist und was sie tut? Vielleicht liest du Dich noch etwas ein in die asynchrone Programmierung. :)


    https://developer.mozilla.org/…ript/Guide/Using_promises


    Wenn du einen Fehler werfen willst solltest du reject() benutzen. Das return vor dem resolve() ist unnötig. Im resolve drin gibst du die Daten weiter, welche du anschliessend verwenden willst. Und dann nutzt du .then() um die Daten zu verwenden sobald die Promise fertig ist.

  • caddy  get_record ist kein Standard JavaScript. Welches Modul/Framework verwendest du denn?

    Außerdem verwendest du get_record Synchron. Wieso wrappst du die dann nochmal ein ein Promise?

  • Hast du Dir die Grundlagen einer Promise durchgelesen? Verstehst du was eine Promise ist und was sie tut? Vielleicht liest du Dich noch etwas ein in die asynchrone Programmierung. :)


    https://developer.mozilla.org/…ript/Guide/Using_promises


    Wenn du einen Fehler werfen willst solltest du reject() benutzen. Das return vor dem resolve() ist unnötig. Im resolve drin gibst du die Daten weiter, welche du anschliessend verwenden willst. Und dann nutzt du .then() um die Daten zu verwenden sobald die Promise fertig ist.

    Hallo jonas,


    danke für Deine Antwort.

    Promise kenne ich und ist auch alles klar ...

    Mein Problem ist das updaten der Daten ....

    Schreiben und lesen mache ich mit promise

    updaten kann ich nur wenn ich die Daten bearbeite und da hängt es bei mir


    grüße caddy

  • caddy  get_record ist kein Standard JavaScript. Welches Modul/Framework verwendest du denn?

    Außerdem verwendest du get_record Synchron. Wieso wrappst du die dann nochmal ein ein Promise?

    hallo Andreas,


    danke für deine Antwort.


    ich verwende ein selbst geschriebenes get_record

    es sieht so aus :


    das outcome würde ich gerne zum bearbeiten und dann updaten nutzen

  • Nur noch mal zur Sicherheit damit meine Frage verstanden wird:


    Speichern in indexedDB geht

    Eine suche nach vorhandenen geht auch alles bestens


    ABER


    einen zu suchen und dann zu ergänzen und oder bearbeiten das bekomme ich nicht hin



    Meine idee dazu ist


    funktion suchen

    gefunden -> dann updaten genau mein Problem

    nicht gefunden -> dann einfügen habe ich kein Problem ....




    Meine get dazu ist weiter oben.


    Vielen Dank an alle schon mal ...


    Caddy

  • Wie gesagt:


    .then() für Erfolg bei der Suche, also update

    .catch() für Misserfolg. Dafür müsstest du aber reject() verwenden und nicht resolve(false).


    Ausserdem returniert get_records() bereits eine Promise, du musst das also nicht nochmals in eine Promise einpacken.

  • caddy Danke für den Code, jetzt verstehe ich was du tun willst.

    jonas3344 hat recht, du gibst aus der Funktion schon ein Promise zurück, allerdings nur wenn db truthy ist.

    Du solltest IMMER ein Promise zurückgeben, sonst kannst du mit der Funktion nicht gut arbeiten.

    Du versuchst das ja selber mit:

    JavaScript
    1. let processedResponse = get_record(key);
    2. if (processedResponse === false) {
    3. return resolve("false") }
    4. else {
    5. return resolve("true")
    6. }

    auszubügeln.


    Versuch das mal so:


    Außerdem hat deine Funktion zwei Abhängigkeiten (db und tablename) die du am Besten mit in die Funktion gibst um sie handelbarer zu machen.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von AndreasB ()

  • Dank bis hier.


    Ich habe die function angepasst.

    Ich bekomme aber immer noch wenn ich die Rückgabe der function ( resolve(event.target.result) ) verarbeiten will

    als Ausgabe

    test 2 [object Promise]

    zurück.


    wie kann ich dieses Objekt ( [object Promise] ) bearbeiten ?

  • Die andere Frage wäre ...

    Wie sieht denn der Code jetzt aus? Also der Funktion und des Aufrufs der Funktion?


    Das ist der Hauptcode

    data sinddie Daten {...}

    strkey ist der zu suchende key der natürlich auch bestandteil von data ist


    Code
    1. get_record(key).then(response => {
    2.    return response;
    3.  }).then(processedResponse => {
    4.    if (processedResponse === true) {
    5.       update_record(data);
    6.    } else {
    7.      insert_record(data);
    8.    }
    9.  })


    Das ist die Get function



    und wenn die Get funktion was findet ist das die update funktion

    Gefunden kann sein das sich ein knoten geädert hat oder ein neuer dazu gekommen ist


    Code
    1. function update_record(record) {  if (db){    const update_transaction = db.transaction(tablename, 'readwrite');    const store = update_transaction.objectStore(tablename);
    2.     return new Promise((resolve, reject) => {      update_transaction.onerror = function(event) {        console.log('Update Transaktion kann nicht durchgeführt werden ' + event.target.errorCode);        resolve(false);      }        update_transaction.oncomplete = function (){        console.log('Update Transaktion durchgeführt !');        resolve(true);      }        let request = store.put(record);      request.onerror = function() {        cosnoel.log('PUT request update_record onerror');        resolve("error");      }      request.onsuccess = function() {        cosnoel.log('PUT request update_record onsuccess');        resolve("error");      }    });  };}


    Code
    1. insert_record(data);


    habe ich mal gepart, denn das funktioniert ja einwandfrei


    Danke für Deine Hilfe


    Caddy

  • Code
    1. get_record(key).then(response => {
    2. return response;
    3. }).then(processedResponse => {
    4. if (processedResponse === true) {
    5.      console.log('data: ' + data)
    6. update_record(data);
    7. } else {
    8. insert_record(data);
    9. }
    10. })

    an der Stelle kommt in der Konsole das -> data: [object Promise]


    der Inhalt von [object Promise] ist meine Daten die gelesen wurde {key:"123", name: "Caddy"}

    ich muss dann z.b. {key:"123", name: "Caddy", Member: true}

    daraus machen und mit

    Code
    1. update_record(data);


    in der datenbank updaten


    Danke


    Caddy

  • Wo kommt den das data her, das du versuchst auszugeben?

    deine Daten befinden sich in der Variablen processedResponse.

    Die musst du ausgeben.


    JavaScript
    1. get_record(key).then(response => {
    2. return response;
    3. }).then(processedResponse => { // <- hier sind deine Daten!
    4. if (processedResponse === true) {
    5. console.log('data: ' + data) // <- wo kommt das her?
    6. update_record(data); // <- oder das?
    7. } else {
    8. insert_record(data); // <- oder das?
    9. }
    10. })
  • Danke für alle Tipps und Fragen ....


    die Herausforderung ist, das ich im negativen Fall trotzdem in den positiven zweig möchte.

    Ich habe es jetzt so gelöst:


    In der suche beim onsuccess in der Function


    Code
    1. request.onsuccess = function (event) {
    2. if (event.target.result === undefined) {
    3. resolve({found: false});
    4. } else {
    5. resolve(event.target.result);
    6. }
    7. };

    somit weiß ich ob er es gefunden hat oder nicht


    der Aufruf ist jetzt wie folgt:


    Damit prüfe ich ob der Key vorhanden ist

    wenn ja mache ich das update

    wenn nein lege ich ihn an


    Danke an alle für die Hilfe.


    Caddy

  • die Herausforderung ist, das ich im negativen Fall trotzdem in den positiven zweig möchte.

    dafür ist Promise.prototype.finally() da.

    (Außer du musst den IE11 berücksichtigen)


    Aber du kannst das natürlich auch so machen wie du es nun tust.

    Solange es funktioniert und nicht mehr als ein Paar Leute damit arbeiten müssen (sonst kann es sein, dass du deine Kollegen damit verwirrst), kannst du das implementieren, wie es für dich passt.