当前位置: 首页 > 知识库问答 >
问题:

同步执行序列化查询

李疏珂
2023-03-14

我正在建立一个网站使用Node.js和序列(与Postgres后端)。我有一个用外键返回许多对象的查询,我想向视图传递一个外键引用的对象列表。

在本例中,Attentings包含Hackathon键,我想返回Hackathon的列表。由于代码是异步的,以下内容在节点中当然不起作用:

models.Attendance.findAll({
    where: {
        UserId: req.user.id
    }
}).then(function (data) {
    var hacks = [];
    for (var d in data) {
        models.Hackathon.findOne({
            where: {
                id: data[d].id
            }
        }).then(function (data1) {
            hacks.append(data1);
        });
    }
    res.render('dashboard/index.ejs', {title: 'My Hackathons', user: req.user, hacks: hacks});
});

有没有办法以同步的方式进行查询,这意味着我直到“黑客”列表充满所有对象才返回视图?

谢谢!

共有3个答案

傅穆冉
2023-03-14

立即调用异步函数表达式

这是在中提到的技术之一:如何在顶层使用异步/等待?托普维尔等待的时间很快就要到2021点了,甚至更好。

最小可运行示例:

const assert = require('assert');
const { Sequelize, DataTypes } = require('sequelize');

const sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: 'db.sqlite',
});
const IntegerNames = sequelize.define(
  'IntegerNames', {
  value: { type: DataTypes.INTEGER, allowNull: false },
  name: { type: DataTypes.STRING, },
}, {});

(async () => {
await IntegerNames.sync({force: true})
await IntegerNames.create({value: 2, name: 'two'});
await IntegerNames.create({value: 3, name: 'three'});
await IntegerNames.create({value: 5, name: 'five'});

// Fill array.
let integerNames = [];
integerNames.push(await IntegerNames.findOne({
  where: {value: 2}
}));
integerNames.push(await IntegerNames.findOne({
  where: {value: 3}
}));

// Use array.
assert(integerNames[0].name === 'two');
assert(integerNames[1].name === 'three');

await sequelize.close();
})();

测试在节点v14.16.0,序列化6.6.2,seqlite3 5.0.2,Ubuntu 20.10。

莫繁
2023-03-14

Sequelize库包含一个在一次调用中合并模型的参数。调整您的where语句,将Hackathons模型带入出席状态。如果这不起作用,请花必要的时间正确设置Sequelize,他们的留档正在不断改进。最后,通过减少错误并使代码对其他程序员具有可读性,您将节省大量时间。

看看这能多干净。。。

models.Attendance.findAll({
    include: [{
        model: Hackathon,
        as: 'hackathon'
    },
    where: {
        UserId: req.user.id
    }
}).then(function (data) {
    // hackathon id
    console.log(data.hackathon.id)

    // attendance id
    console.log(data.id)
})

还...

Hackathon.belongsTo(Attendance)
Attendance.hasMany(Hackathon)
sequelize.sync().then(() => {
  // this is where we continue ...
})

了解更多关于Sequelize的信息包括:http://docs.sequelizejs.com/en/latest/docs/models-usage/

何峰
2023-03-14

使用promise。all执行所有查询,然后调用下一个函数。

models.Attendance.findAll({
    where: {
        UserId: req.user.id
    }
}).then(function (data) {
    // get an array of the data keys, (not sure if you need to do this)
    // it is unclear whether data is an object of users or an array. I assume
    // it's an object as you used a `for in` loop
    const keys = Object.keys(data)
    // map the data keys to [Promise(query), Promise(query), {...}]
    const hacks = keys.map((d) => {
      return models.Hackathon.findOne({
        where: {
          id: data[d].id
        }
      })
    })
    // user Promise.all to resolve all of the promises asynchronously
    Promise.all(hacks)
      // this will be called once all promises have resolved so
      // you can modify your data. it will be an array of the returned values
      .then((users) => {
        const [user1, user2, {...}] = users
        res.render('dashboard/index.ejs', {
          title: 'My Hackathons', 
          user: req.user, 
          hacks: users
        });
      })
});
 类似资料:
  • 一旦遇到这样的问题,这里还有更多内容,然后发现了 一个适当恶劣的解决方法。 这篇文章没有列在索引中,但是为满足你的好奇心而保留了下来。

  • 我有一个需要在循环中执行的请求promise,比如: 问题是我永远不知道数组中有多少元素,所以我需要一个动态模式。有没有可能混合同步和异步世界,以便在一个时刻只有一个请求是活动的(序列不重要)?

  • 问题内容: 我的任务是按以下顺序创建线程:如果A开始->启动B和C,如果B开始->启动D。并以相反的顺序销毁它们如果D然后B。如果B和C然后A。它。我设法做到了,但我想还有更好的方法。你有什么建议吗? 在您发表评论后,我更改了代码,这非常简单。但是现在看起来“愚蠢”。我想更改if语句和实现的硬性,有什么建议吗?寻求建议,我正在与您一起学习。 这是我的新代码: 问题答案: 您的代码中存在一些缺陷,这

  • 问题内容: 我过去曾经做过一些jQuery,但是我完全坚持了这一点。我了解使用同步ajax调用的优缺点,但是在这里将是必需的。 远程页面已加载(由firebug控制),但未显示任何返回信息。 我应该采取什么措施才能使函数正确返回? 问题答案: 在发出同步请求时,应该 范例-http://api.jquery.com/jQuery.ajax/#example-3 请注意: 设置异步属性设置为fals

  • 问题内容: 我需要执行RestRequest并获取一些JSON,因此我不确定我的方法是否真正异步,因为使用此方法时,UI仍然有些冻结。 特别针对以下代码行: 真的不同步吗?因为它似乎阻塞了UI。您能告诉我如何使此函数正确异步吗? 问题答案: 似乎作为参数传递给的委托正在UI线程上执行。如果是这种情况,只需使用即可在线程池上运行委托。 是田野吗?在我看来,它应该是局部变量。另外,在反序列化json之