2014-02-12 6 views
11

In Sequelize> = 1,7 we can use promisesPromises in Sequelize: wie Ergebnisse erhalten von jedem Versprechen

Können Sie mir erklären, wie ich Werte von jedem Benutzer in diesem Code erhalten können:

var User = sequelize.define("user", { 
    username: Sequelize.STRING 
}) 


User 
    .sync({ force: true }) 
    .then(function() { return User.create({ username: 'John' }) }) 
    .then(function(john) { return User.create({ username: 'Jane' }) }) 
    .then(function(jane) { return User.create({ username: 'Pete' }) }) 
    .then(function(pete) { 
    console.log("we just created 3 users :)") 
    console.log("this is pete:") 
    console.log(pete.values) 

    // what i want: 
    console.log("this is jane:") 
    console.log(jane.values) 

    console.log("this is john:") 
    console.log(john.values) 
    }) 

UPD

Alle Werte müssen für Assoziationen mit anderen Modellen verwendet werden. Eigentlich brauche ich einige, wie dieser Code:

User.hasMany(Group) 
Group.hasMany(User) 

User 
    .sync({ force: true }) 
    .then(function() { return User.create({ username: 'John' }) }) 
    .then(function(john) { return User.create({ username: 'Jane' }) }) 
    .then(function(jane) { return User.create({ username: 'Pete' }) }) 
    .then(function(pete) { return Group.findOrCreate({id: 1}) }) 
    .then(function(group) {return group.setUsers([john, jane, pete])}) 
    .then(function(result) { console.log(result)}) 
}) 
+0

Ich habe noch nie von Sequelize gehört, aber 'sync ({force: true})' sieht nicht so aus, als würden Sie asynchrone Versprechungen benötigen :-) – Bergi

+0

Eigentlich kann 'sync ({force: true})' entfernt werden, wenn diese Methode aufgerufen wird am Projektstart zum Beispiel – dpolyakov

+1

Sync hat keine Beziehung zu pr Omises in diesem Fall; Es ist eine Sequelize-Option, um die Tabellenerstellung zu erzwingen. – martyman

Antwort

2

Try this ...

User 
    .sync({ force: true }) 
    .then(function() { 
     return User.create({ username: 'John' }); 
    }) 
    .then(function (john) { 
     console.log("this is john:"); 
     console.log(john.values); 
     return User.create({ username: 'Jane' }); 
    }) 
    .then(function (jane) { 
     console.log("this is jane:"); 
     console.log(jane.values); 
     return User.create({ username: 'Pete' }); 
    }) 
    .then(function (pete) { 
     console.log("we just created 3 users :)"); 
     console.log("this is pete:"); 
     console.log(pete.values); 
    }); 
+0

Dies kann das einzige anständige und doch einfache Beispiel für Sequelize Versprechen sein, die ich gefunden habe. Danke. – edwardsmarkf

19

Die Drossel Art und Weise sind die collection helper functions.

Wenn man sie parallel erstellen möchten, verwenden Sie map:

User.sync({ force: true }) 
    .then(function() { 
    return Promise.map(['John', 'Jane', 'Pete'], function(name) { 
     return User.create({ username: name }); 
    }) 
    }).spread(function(john, jane, pete) { 
    console.log("we just created 3 users :)") 
    console.log("this is john:") 
    console.log(john.values) 
    console.log("this is jane:") 
    console.log(jane.values) 
    console.log("this is pete:") 
    console.log(pete.values) 
    }) 

Wenn Sie diese nacheinander erstellen müssen, es nur ändern mapSeries (3.0+).

Wenn das Array muss nicht dynamisch sein, und Sie wollen einfach wie, haben bei How do I access previous promise results in a .then() chain? einen Blick in Ihrem Beispiel einen gemeinsamen Wert durch das Versprechen Kette aufzusteigen.

+4

Ich möchte nur erwähnen, dass '.sync ({force: true})' alle Tabellen in der aktuellen Datenbank löscht. Achtung! – wprl

+0

@wprl: Ich weiß nicht, Fortsetzung. Sollte (kann) ich diesen Anruf auslassen? – Bergi

+0

@Biergi, überprüfen Sie die Sync-Dokumentation: https://github.com/sequelize/sequelize/wiki/API-Reference-Sequelize#sync Sie möchten wahrscheinlich immer noch synchronisieren, aber die force-Option löscht die Tabellen jedes Mal, wenn sie aufgerufen wird. Wirklich Sie möchten Migrationen in der Produktion verwenden, aber ich bin nicht zu diesem Punkt in meinen Studien gekommen :) – wprl

4

Verwendung keine zusätzliche Bibliotheken (und wenn Sie die Reihenfolge der schafft pflegen müssen), können Sie dies tun, indem einfach variable Erstellung (s) in dem umschließenden Umfang die hält die Werte:

var created = {}; 
User 
    .sync({ force: true }) 
    .then(function() { return User.create({ username: 'John' }) }) 
    .then(function(john) { created.john = john; return User.create({ username: 'Jane' }) }) 
    .then(function(jane) { created.jane = jane; return User.create({ username: 'Pete' }) }) 
    .then(function(pete) { 
    created.pete = pete; 

    console.log("we just created 3 users :)") 
    console.log("this is pete:") 
    console.log(created.pete.values) 

    // what i want: 
    console.log("this is jane:") 
    console.log(created.jane.values) 

    console.log("this is john:") 
    console.log(created.john.values) 
    }) 

Allgemein Allerdings würde ich empfehlen, dass Sie sich auf @ Bergis Antwort stützen, die eine Liste von Versprechen erstellt und auf alle Versprechen wartet, die abgeschlossen werden müssen.

bearbeitet basierend auf Frage Update:

User.hasMany(Group) 
Group.hasMany(User) 

User 
    .sync({ force: true }) 
    .then(function() { 
    var users = Promise.map(['John', 'Jane', 'Pete'], function(name) { 
     return User.create({ username: name }); 
    }); 
    var group = Group.findOrCreate({id: 1}); 
    return Promise.all([group, users]); 
    }) 
    .spread(function(group, users) {return group.setUsers(users)}) 
    .then(function(result) { console.log(result)}) 
}) 
:

Ihren aktualisierten Codeblock verwenden und @ die Bergi aufbauend auf Anregung von Promise.map, können Sie mit so etwas wie die folgenden Verwendung von Variablen in einem höheren Umfang vermeiden

+0

Danke. Ich habe ein Update für meine Frage hinzugefügt. Sieht aus wie dein Beispiel Code gut für meine Aufgabe – dpolyakov

+0

Du hast das 'Versprechen.alle 'halbwegs rechts :-)' user' haben bereits den Typ 'Promise ', 'group' hat den Typ' Promise 'und jetzt wollen wir' Promise <(Group, [User])> bekommen '- warten auf alle Benutzer erstellt werden und die Gruppe gefunden werden ... – Bergi

+0

Ich habe die Dokumentation für' Promise.spread' gelesen und festgestellt, dass es garantiert, dass ein Anruf zu 'Promise.all'. Deshalb glaubte ich, dass ich das "Promise.all" nicht brauchte, um das zurückgegebene Array zu umhüllen. Ich konnte keine Dokumentation für 'Promise.map' finden, also wusste ich nicht, dass es mir eine' Promise 'anstelle von' [Promise ] 'geben würde. Deshalb existierte mein Kommentar über die Notwendigkeit, dass das 'Promise.all' das Benutzer-Array umhüllt. Ich habe vergessen zu prüfen, ob 'Promise.all' in ein gefundenes Array recurse (wie in' [ | [Promise ]>]). – squid314

Verwandte Themen