12

Sequelize >=1.7 では、promiseを使用できます

このコードで各ユーザーから値を取得する方法を説明してもらえますか:

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

他のモデルとの関連付けを設定するには、すべての値が必要です。実際には、次のようなコードが必要です:

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)})
})
4

3 に答える 3

21

Bluebird の方法はコレクション ヘルパー関数です。

それらを並行して作成する場合は、次を使用します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)
  })

連続して作成する必要がある場合は、mapSeries(3.0+) に変更してください。

配列を動的にする必要がなく、例のようにプロミスチェーンを介して共有値を渡したい場合は、How do I access previous promise results in a .then() chain? をご覧ください。.

于 2014-02-12T01:08:45.940 に答える
4

追加のライブラリを使用せずに (作成の順序を維持する必要がある場合)、値を保持する外側のスコープに変数を作成するだけでこれを行うことができます。

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)
  })

ただし、一般的には、Promises のリストを作成し、すべての Promise が完了するのを待つ @Bergi の回答に傾くことをお勧めします。

質問の更新に基づいて編集:

更新されたコード ブロックを使用し、@Bergi の提案に基づいてビルドするとPromise.map、次のようなより高いスコープで変数を使用することを避けることができます。

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)})
})
于 2014-02-12T01:14:50.120 に答える
3

これを試して...

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);
    });
于 2014-02-12T00:56:34.743 に答える