real_mathos | Salut,
J'essaie d'écrire une fonction permettant de charger toutes les associations dans une liste d'objets récupérés via Sequelize.js . Le problème est que les méthodes de Sequelize s'exécutent toutes en asynchrone. Du coup c'est assez difficile de les enchaîner dans un ordre précis.
Voilà comment je procède:
- Je récupère d'abord ma liste d'objets
- Ensuite je parcours chaque objet, je lance une requête pour chaque association et je stocke le résultat obtenu dans l'objet
Voilà un exemple de code:
Code :
- db.Bien.findAll({
- where: {
- ville: req.param('ville')
- }
- }).success(function(biens) {
- helper.loadAssocs(biens, ['Proprietaire']).success(function() {
- })
- }
- loadAssocs = function(objects, assocsToLoad) {
- var func, func2, i, object, _i, _len;
- if (!Array.isArray(objects)) {
- objects = [objects];
- }
- if (!Array.isArray(assocsToLoad)) {
- assocsToLoad = [assocsToLoad];
- }
- for (i = _i = 0, _len = objects.length; _i < _len; i = ++_i) {
- object = objects[i];
- object[i].assocsToLoad = assocsToLoad;
- }
- func2 = function(callback) {
- var assocName;
- console.log('plop!');
- assocName = assocsToLoad.pop();
- return eval('object.get' + assocName + '()').success(function(assocValue) {
- object[assocName] = assocValue;
- callback(null);
- });
- };
- func = function(callback) {
- console.log('yo!');
- object = objects.pop();
- async.forEach(object.assocsToLoad, func2);
- return;
- return chainer.add(emitter.run());
- };
- return new Sequelize.Utils.CustomEventEmitter(function(emitter) {
- return async.forEach(objects, func, function() {
- return emitter.emit('success', null);
- });
- }).run();
- }
|
Ce code ne fonctionne évidemment pas mais il donne à peu près une idée de ce que j'essaie de faire (enfin j'espère)... Message édité par real_mathos le 04-06-2012 à 18:36:59
|