2016-08-01 21 views
4

Ich bin neu bei node.js und pg-Versprechen kommt aus einer Synchronis-Programmierung Hintergrund erfordert ein neues Denken.synchrone Programmierung mit pg-Versprechen

Ich würde mit einem Szenario der Datenbankinitialisierung vor der Hauptprogrammlogik beginnen.

Nach diesem Beispiel: https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#simple-select

db.any("select * from users where active=$1", [true]) 
    .then(function (data) { 
    // success; 
    }) 
    .catch(function (error) { 
    // error; 
    }); 

Würde mein Code entweder als lesen:

db.query("DELETE FROM records") 
    .then(function (data) { 
    // success; 
    console.log("This is where all my main logic goes"); 
    }) 
    .catch(function (error) { 
    // error; 
    }); 

Oder wäre es lesen als:

db.query("DELETE FROM records") 
    .then(function (data) { 
    // success; 
    }) 
    .catch(function (error) { 
    // error; 
    }); 
console.log("This is where all my main logic goes"); 

Mein Verständnis ist, mit der das Letzteres würde die Nachricht anzeigen, bevor die Datensätze gelöscht wurden ed.

Update: Nach der Lektüre zahlreicher Artikel über Versprechungen und Rückrufe Ich verstehe, dass pg-Versprechen .then sein verwendet Verkettungs und .catch für beide Erfolg und Fehlerszenarien. Ich glaube auch, jetzt habe ich die pg-Versprechen Befehl verstehen sollte innerhalb einer Funktion Wrapper gestellt werden wie:

function initialiseDB() { 
    db.query("DELETE FROM records") 
    .then(function (data) { 
     // success; 
    }) 
    .catch(function (error) { 
     // error; 
    }); 
    } 

Dann aus meinem Code würde ich die Funktion mit einem einfachen Befehl aufrufen, die die Funktion asynchron laufen würde:

Ich bin mir aber immer noch nicht sicher, wie dieses Konzept der asynchronen Codierung und Versprechen in die Gesamtstruktur eines Programms passt, da sicherlich fast alles in einem Programm die Initialisierung als erste abgeschlossen hätte. Sollte das gesamte Programm nicht in den ".then" -Abschnitt der Funktion gestellt werden? d. h. der einzige Code auf der obersten Ebene wäre effektiv die Funktion intialiseDB()?

// Start of code here 
var pgp = require('pg-promise')(); 

//Configure the database connection 
var config = { 
    user:    'username', //env var: PGUSER 
    database:   'database', //env var: PGDATABASE 
    password:   'password', //env var: PGPASSWORD 
}; 

var db = pgp(config); 

function initialiseDB() { 
    db.query("DELETE FROM records") 
    .then(function (data) { 
     // This is where the main program logic goes after this line; 
    }) 
    .catch(function (error) { 
     // error; 
    }); 
} 

// Commence the program here 
initialiseDB(); 
+0

Es ist der erste. Und Sie sollten über die richtige Verwendung von Versprechen lesen, es gibt heute viele Informationen darüber, beginnend mit [PromiseJS] (https://www.promisejs.org/). –

+0

Danke dir, alles neu für mich. "Schon früh experimentierte der Knoten mit einer Funktion namens" Versprechungen ", die eine Reihe von Funktionen hinzufügte, um asynchronen Code linearer erscheinen zu lassen. Er wurde aus verschiedenen Gründen aus dem Knoten entfernt:" https://github.com/maxogden/art -of-node/blob/master/readme.md – Dercni

+0

Das ist ein schlechter Artikel, um überhaupt einen solchen Unsinn vorzuschlagen. Versprechen ist der beste Weg, um heute asynchronen Code zu schreiben. –

Antwort

0

PG versprechen können tatsächlich für den Einsatz von generators und async/await auf neueren NodeJS Versionen. Generators erfordern einen Adapter mit Versprechungen, die in das System eingebaut vitaly, so dass ein generator function Versorgung wird für eine sauberere Codefluß in synchroner Weise

Taken from the repository under the tag task

Ohne generators erlauben:

db.task(t => { 
     // this.ctx = task config + state context; 
     return t.one('SELECT * FROM users WHERE id = $1', 123) 
      .then(user => { 
       return t.any('SELECT * FROM events WHERE login = $1',user.name); 
      }); 
    }) 
    .then(events => { 
     // success; 
    }) 
    .catch(error => { 
     // error; 
    }); 

Mit generators:

db.task(function * (t) { 
     // this.ctx = task config + state context; 
     let user = yield t.one('SELECT * FROM users WHERE id = $1', 123); 
     return yield t.any('SELECT * FROM events WHERE login = $1', user.name); 
    }) 
    .then(events => { 
     // success; 
    }) 
    .catch(error => { 
     // error 
    }); 

Bei Verwendung async/await, können Sie einfach die function * (t) durch async function (t) und yield durch await ersetzen und es wird ähnlich funktionieren.

Einige Einschränkungen:

In komplexeren Logik, sollten Sie fangen Blöcke um Dinge versuchen verwenden, die, wie sie werden Blase der Fehler in generators und async/await

db.task(function * (t) { 
    yield Promise.reject(new Error('This will cause your app to error') 
} 

You should also pay close attention to his pg-promise demo! Es wird möglicherweise fehl lehre dir tolle Dinge wie das Extend-Event, Repos, externe SQL-Dateien und viele andere tolle Dinge in der Bibliothek wie Helfer!