我从表中获得了一些标记名称,然后我需要在另一个中搜索每个标记名称,但我不能用 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
});
}
}
答案 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;
});
}));