想象一下,你正在使用國家隊和運動員的數據庫(比如奧運會)。測試您的應用程序時,您每次都創建一個新的數據庫。這裏有兩種型號:使用Sequelize創建多部分數據庫對象:承諾何時完成?
const Team = sequelize.define('team', {
name: {type: Sequelize.TEXT, allowNull: false}
})
const Athlete = sequelize.define('athlete', {
name: {type: Sequelize.TEXT, allowNull: false}
})
Team.hasMany(Athlete)
Athlete.belongsTo(Team)
現在,你必須爲你創造了球隊的函數:
function mock_database() {
let team0 = Team.create({
name: 'TeamGB'
}).then(team => {
generate_athletes(team)
// Or maybe I need to return the nested promises?
// return generate_athletes(team)
})
let team1 = Team.create({
name: 'TeamFr'
}).then(team => {
generate_athletes(team)
// Or maybe I need to return the nested promises?
// return generate_athletes(team)
})
return [team0, team1]
}
現在,generate_athletes
創建嵌套的數據庫對象(在隊中的運動員):
function generate_athletes(team) {
let athlete0 = Athlete.create({
name: 'John Smith'
}).then(athlete => {
team.setAthletes(athlete)
athlete.setTeam(team)
})
let athlete1 = Athlete.create({
name: 'Joanna Smith'
}).then(athlete => {
team.setAthletes(athlete)
athlete.setTeam(team)
})
return [athlete0, athlete1]
}
在這一點上,我想等到數據庫擁有所有的數據。我可以用Promise.all(mock_database()).then(() => {/*my application starts here*/})
來做到這一點,它將等待team0
和team1
這兩個承諾。但是,這是否保證我會隱含地等待athlete0
和athlete1
?或者我需要回復這些承諾,將它們全部納入[team0, team1, promises0, promises1]
的大數組中,然後等待?
好吧,在我看來,你認爲'generate_athletes'會返回一個使用'Promise.all()'創建的promise,並將其放入'team0'(另一個放在'team1'中)。但是,如果你返回一系列承諾,例如'return [athlete0,athlete1]',你會期望'team0'(和'team1')是那個數組,不是嗎?因爲我看到的是'team0'和'team1'總是*單個承諾(而不是數組),不管你返回什麼。 – alisianoi
你知道嗎,無視這個問題。我已經使用你的'返回Promise.all()'技巧(它將嵌套的承諾組合成一個傳播的承諾),重新編寫我的數據庫例程,現在它按預期工作。如果你可以添加一個鏈接到某種官方文檔來展示這種方法,那就太棒了。 – alisianoi
只是爲了記錄,如果你返回一個沒有'Promise的數組。所有「,那麼你實際上將立即從'generate_athletes'中解析,因爲數組不是承諾。查看我的答案瞭解更多細節。 –