2016-02-29 25 views
12

'daki işlemlerde döngüleri ve vaatleri kullanma Şu anda bir Nodejs, Express, Sequelize (w. PostgreSQL) uygulaması yapıyorum ve işlemler ve döngülerle birlikte vaatleri kullanmayla ilgili birkaç sorunla karşılaştım.Sequelize

Bir işlemde döngüleri nasıl kullanacağımı anlamaya çalışıyorum. Her bir üye için bir liste listesi oluşturmaya ve veritabanında yeni bir kullanıcı oluşturmaya çalışıyorum.

Aşağıdaki kodun yanlış olduğunu biliyorum ama ne yapmaya çalıştığımı gösterir.

Beni doğru yöne yönlendiren var mı? Ben işlemle ilgili yakalama biçimlendirme için

Maalesef atlar düşünüyorum

 var members = req.body.members; 
     models.sequelize.transaction(function (t) { 
      for (var i = 0; i < members.length; i++) { 
       return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) { 
        return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);}); 
       }) 
      }; 
     }).then(function (result) { 
      console.log("YAY"); 
     }).catch(function (err) { 
      console.log("NO!!!"); 
      return next(err); 
     }); 

cevap

19

Sen inanmıyorum bir Promise.all

var members = req.body.members; 
    models.sequelize.transaction(function (t) { 
     var promises = [] 
     for (var i = 0; i < members.length; i++) { 
      var newPromise = models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}); 
      promises.push(newPromise); 
     }; 
     return Promise.all(promises).then(function(users) { 
      var userPromises = []; 
      for (var i = 0; i < users.length; i++) { 
       userPromises.push(users[i].addInvitations([group], {transaction: t}); 
      } 
      return Promise.all(userPromises); 
     }); 
    }).then(function (result) { 
     console.log("YAY"); 
    }).catch(function (err) { 
     console.log("NO!!!"); 
     return next(err); 
    }); 

Eğer sequelize işlemler içinde catch gerekir kullanmalıdır . Cep telefonunda.

tüm sözler .sonra çalıştırmadan önce dönmek (veya başarısız) için Promise.all bekleyecek ve .then geri arama Sen yapıları döngü inşa kullanmak gerekir her dizide

+0

Cevabınız için teşekkürler, ancak işlem için bir söz zincirini döndürmem gerektiğini belirten bir hata alıyorum. Her Promise.all önce "return" eklemeyi denedim ama sonra "get" işlenmemiş reddetme işlemi bu işlemde çağrıldı (fc7be023-1980-455e-9934-7816420daa2b), artık kullanamazsınız "_ – ReturnToZero

+1

Evet eksik geri dönüş ve hiçbir şey userPromises'a itilmez. –

+0

@BenjaminGruenbaum teşekkürler dün bunu mobilde yaptım ve geri gelme şansı bulamadım ve – Datsik

4

tüm vaadi verileri olacak bluebird ait sequelize ile birlikte gelen:

var members = req.body.members; 
models.sequelize.transaction(t => 
    Promise.map(members, m => // create all users 
    models.User.create({firstname: m, email: m, 'pending':true}, {transaction: t}) 
).map(user => // then for each user add the invitation 
    user.addInvitations([group], {transaction: t}) // add invitations 
)).nodeify(err); // convert to node err-back syntax for express 
+0

da çalıştıktan sonra güncelleme yapacağım. Ayrıca çok şık bir kod. Yine de çalışamaz .nodeify (err); Tanımlanmadı diyor. Daha önce nodeify kullanmadınız, bu yüzden muhtemelen bir şey eksik. – ReturnToZero

+0

Nodeify (sonraki) olmalıdır - üzgünüm –

0

İlk: https://caolan.github.io/async/docs.html

Yani, kolayca:

// requiring... 
const async = require('async'); 

// exports... 
createAllAsync: (array, transaction) => { 
    return new Promise((resolve, reject) => { 
    var results = []; 
    async.forEachOf(array, (elem, index, callback) => { 
     results.push(models.Model.create(elem, {transaction})); 
     callback(); 
    }, err => { 
     if (err) { 
     reject(err); 
     } 
     else { 
     resolve(results); 
     } 
    }); 
    }); 
} 
+0

Stack Overflow'a Hoş Geldiniz, cevap verdiğiniz için teşekkür ederiz. Lütfen gözden geçirin: https://stackoverflow.com/help/how-to-answer – Daniel