2016-06-26 4 views
1

Ich habe diese Versprechen-Kette. Im zweiten Versprechen brauche ich user, der von user.save zurückgegeben wird. Wie kann ich es bekommen, ohne die Versprechens-Kette zu brechen? Ich brauche es, um eine Kette zu sein, weil ich das letzte Versprechen benötige, um das richtige Attribut zum Versprechen zurückzugeben, wenn die Funktion aufgerufen wird.Wie man Variablen in der Versprechenskette weitergibt?

Ich nenne ein Verfahren wie folgt aus:

User.createRider(req.query).then((user) => { 
    res.json(user); 
}); 



User = sequelize.define('user', {},{ 
    classMethods: { 
     createRider: function(params) { 
      var values = [], 
       userAttributes = sequelize.models.userAttributes, 
       user = User.build(), 
       name = userAttributes.build({name: 'name', value: params.name}), 
       fbprofile = userAttributes.build({name: 'fbprofile', value: params.fbprofile}), 
       phone = userAttributes.build({name: 'phone', value: params.phone}); 

      user = user.save() 
        .then(sequelize.Promise.all([ 
          fbprofile.save(), 
          name.save(), 
          phone.save() 
         ]) 
        ) 
        .then((attributes) => { 
         user.addUserAttributes(attributes); 
         return user; 
        }); 
      return user; 
     } 
    } 
}); 
+0

Können Sie den Code für addUserAttributes() bitte auch posten? – marton

+0

Ich werde dies nicht als Antwort veröffentlichen, da Sie speziell nach Promises fragen, aber ich werde sagen, dass dieses Problem mit async.js sowohl trivial als auch klar zu lösen ist. Ich benutze asyncwasserfall für diese Art von Sache. – Paul

Antwort

3

Wenn ich das richtig verstanden, was gegenüber dem Vorjahr Notwendigkeit, Sie smth wie dieser Code versuchen:

user = user.save() 
    .then(savedUser => { 
     return sequelize.Promise.all([ 
      fbprofile.save(), 
      name.save(), 
      phone.save() 
     ]) 
     .then((attributes) => { 
      console.log(savedUser); // this guy 

      user.addUserAttributes(attributes); 
      return user; 
     }); 
    }); 
+0

Nein, dies wird Benutzer aus der falschen Versprechenskette, aktualisierte Frage zur Klarheit zurückgeben. – Himmators

+0

Warum ist es die falsche Versprechungskette? Der Aufrufer erhält immer noch den zurückgegebenen 'user' vom letzten' then() '. – robertklep

+0

Ich sehe nicht, wie diese Lösung funktionieren wird. savedUser ist nicht im Bereich für das zweite Versprechen. –

1

Ich denke, so etwas wie das ist, was du bist Suchen nach:

user = user.save(); 
let seq = user.then(sequelize.Promise.all([ 
    fbprofile.save(), 
    name.save(), 
    phone.save() 
])); 

return Promise.all([user,seq]) 
    .then((results) => result[0].addUserAttributes(results[1])); 
0

Ich bin nicht sicher, ob ich Ihren Code/Absichten völlig verstehe, aber ich denke, dass Sie suchen etw. wie folgt:

User = sequelize.define('user', {},{ 
    classMethods: { 
     createRider: function(params) { 
      var userAttributes = sequelize.models.userAttributes; 
      var attrs = [ 
       {name: 'name', value: params.name}, 
       {name: 'fbprofile', value: params.fbprofile}, 
       {name: 'phone', value: params.phone}, 
      ]; 

      return sequelize.Promise.all(Array.prototype.concat(
       User.build().save(), 
       attrs.map(o => userAttributes.build(o).save()) 
      )).then(([user, ...attributes]) => { 
       user.addUserAttributes(attributes); 
       return user; 
      }) 
     } 
    } 
}); 
Verwandte Themen