2017-12-29 22 views
1

Ich möchte eine Datenbanktabelle mit Promises gehen, um die Daten von jedem Schritt synchron zu erhalten. Ich glaube, mein Code wie etwas aussehen soll:Tabelle Spaziergang/Rekursion mit Promise

function get_next_id(the_id) { 
    return new Promise(function(resolve) { 
     connection.query(get_parent_query, [ the_id ], function (e, r, f) { 
      resolve(r[0].from_visit); 
     }); 
    }); 
} 

var page_id = 60239; 
while (page_id > 0) { 
    get_next_id(page_id).then((i) => page_id = i); 
} 

Das Problem mit diesem Code ist, dass die Schleife wiederholt sofort ohne darauf zu warten das dann() in Anspruch nehmen.

In this answer schlägt das Poster vor, entweder Promise.race() zu verwenden oder Promise insgesamt zugunsten von async zu verzichten.

+0

Diese Antwort in * 2015 war *. Die Dinge haben sich seit ... geändert. –

Antwort

0

Ich verstehe nicht, warum Sie eine Reihe von ids erhalten möchten, aber nicht mit den Ergebnissen nichts zu tun . Deine ursprüngliche Funktion war fast da, aber du solltest mit dem Fehler und den Ergebnissen bisher ablehnen, wenn etwas schief geht.

und lösen mit allen Ergebnissen, wenn alles gut geht:

function get_next_id(the_id,results=[]) { 
    return new Promise(function (resolve,reject) { 
    connection.query(get_parent_query, [the_id], function (e, r, f) { 
     if(e){ 
     //reject if something goes wrong with error and 
     // what has been done so far 
     reject([e,results]); 
     return; 
     } 
     resolve(r); 
    }); 
    }) 
    .then(function (r){ 
    if(r[0].from_visit===0){ 
     return results; 
    } 
    //recusively call unless id is 0 
    return get_next_id(r[0].from_visit,results.concat(r)) 
    }); 
} 

get_next_id(22) 
.then(
    results=>console.log("got results:",results) 
    ,([error,resultsSoFar])=>console.error(
    "something went wrong:",error, 
    "results before the error:",resultsSoFar 
) 
); 
+0

Danke, ich habe diesen Code zum Erstellen einer Liste verknüpfter Daten verwendet. Ich wechselte zu sqlite, so dass ich eine synchrone Bibliothek verwenden konnte, die meinen Code sehr vereinfacht. –

2

Mai verwenden async/await:

(async function(){ 

    var pageId = 60239; 
    while (page_id > 0) { 
    pageId = await get_next_id(pageId); 
    } 

})() 

oder verwenden indirekte Rekursion:

(function next(pageId){ 
    if(pageId <= 0) return; 
    get_next_id(pageId).then(next); 
})(60239); 
+0

Danke, der indirekte Rekursionsansatz funktioniert für mich. –