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)})
})
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+)に変更してください。
配列が動的である必要がなく、例のようにpromiseチェーンを介して共有値を渡したいだけの場合は、 以前のpromiseの結果に.then()でアクセスするにはどうすればよいですか?チェーン? 。
追加のライブラリを使用せずに(そして作成の順序を維持する必要がある場合)、値を保持する囲んでいるスコープに変数を作成するだけでこれを行うことができます。
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)
})
ただし、一般的には、約束のリストを作成し、すべての約束が完了するのを待つ@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)})
})
これを試して...
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);
});