Nœud + Sequelize: Comment faire pour vérifier si l'élément existe avant de l'ajouter? (async confusion)
Je suis malheureusement de nouveau à nœud et en cours d'exécution dans une certaine confusion quant à l'asynchrone/synchrone de l'exécution du nœud.
Je suis l'aide d'un noeud, sequelize avec sqlite et async.js.
J'ai une série de Articles
, dont chacune a un certain nombre de Authors
.
Pour chaque Authors
dans chaque Article
, je voudrais vérifier si le Author
existe. Si pas, créez-la.
Le problème est que, sur le premier cycle, en double auteurs sont en cours de création, je suppose en raison asynchrone fonctionnalité causant un problème avec la vérification de l'existence.
Par exemple, avec le tableau: authors = ['A. Test', 'B. Test', 'C. Test', 'A. Test']
et le code:
async.each(authors, function(item, callback){
Author.sync().then(function(){
Author.count({ where: {name: item.trim()} }).then(function(count){
if (count != 0) {
console.log('Author already exists')
} else {
console.log('Creating author...')
Author.create({
name: item.trim()
})
}
})
})
})
Sur le premier run, permettra de créer une table:
ID | name
------------
0 | A. Test
1 | B. Test
2 | C. Test
3 | A. Test
Ce que je fais mal? J'ai l'impression de manquer un concept fondamental de vs asynchrone synchrone de l'exécution du Nœud.
(J'ai aussi essayé asynchrone.eachSeries qui est censé exécuter en série plutôt qu'en parallèle?)
Edit: Légèrement remaniée, mais encore la création de doublons
async.eachSeries(authors, function(authorName, callback){
Author.findOne({ where: {name: authorName.trim()} }).
then(function(author){
if (author) {
//Author exists...
callback()
} else {
//Author does not exist...
Author.create({
name: authorName.trim()
}).then(function(author){
callback()
})
}
})
})
OriginalL'auteur waffl | 2015-08-04
Vous devez vous connecter pour publier un commentaire.
Changer votre chaque pour
eachSeries
et appelle le callback et vous devriez être en or.Est-ce que votre Auteur.créer de l'appui de rappel, comme je l'ai mentionné dans les commentaires?
Désolé, comment voulez-vous dire? Le
create
méthode est mis en œuvre par sequelize ce qui résulte en une promesseOk, ça fonctionne, merci! Juste pour éclaircir ma compréhension de l'écoulement, ce qui est le
callback()
fonction qui est appelée? Je trouve la formulation de la async.js documentation à confusion.Il raconte la boucle à continuer
OriginalL'auteur trex005