sequelize中的多个查询

时间:2016-10-18 12:29:50

标签: node.js sequelize.js

我从表中获得了一些标记名称,然后我需要在另一个中搜索每个标记名称,但我不能用 for 或类似的东西来执行它,因为sequelize的异步方式有效。还有另一种形式可以解决这个问题吗?

db.archivos.findAll({
    attributes: ['nombre','texto','related'],
        where: {
            nombre: nombre
        },
        raw: true
        }).then(function(archivos){
           if(archivos.length != 0){
              tags = archivos[0].related.split('/');
              cantTags = tags.length;


              for(i=0; i < cantTags; i++){
                db.tags.findAll({
                attributes: ['paginasRelacionadas'],
                    where: {
                        nombre: tags[i]
                    },
                    raw: true
                }).then(function(query){
                    related += paginasRelacionadas 
                });
              }
           }

2 个答案:

答案 0 :(得分:0)

您可以使用Promises来解决异步问题。看看你发布的代码,我想像这样的东西可以解决问题(使用ES2015):

db.archivos.findAll({
    attributes: ['nombre','texto','related'],
    where: {
        nombre: nombre
    },
    raw: true
}).then((archivos) =>
{
   const findTags => (related, tags, i=0) 
   {        
        const tag = tags[i];

        if(!tag)
            return Promise.resolve(related);

        return db.tags.findAll({
            attributes: ['paginasRelacionadas'],
            where: {
                nombre: tag
            },
            raw: true
        }).then(function(newRelated){
            related.push(...newRelated);
            return findTags(related, tags, ++i);
        });    
   };

   if(!archivos.length)
      return archivos;

   const tags = archivos[0].related.split('/');
   return findTags(archivos.related, tags).then((related) => 
   {
      archivos[0].related = related;
      return archivos;
   });

}).then((archivos) => 
{
    //do whatever you want with the archivos (here the 
    //first item will have the related properties with 
    //the new values)
})

答案 1 :(得分:0)

@demarchisd是对的。不是同步迭代结果,而是需要使用promises进行迭代。类似的东西:

return db.Pormise.all(tags.map(function(tag)=>{
  db.tags.findAll({
  attributes: ['paginasRelacionadas'],
      where: {
          nombre: tags[i]
      },
      raw: true
  }).then(function(query) {
      related += query.paginasRelacionadas;
  });
}));