我只想在获得第一个发出的值时执行 tap()
就像是:
Observable
.pipe(
tap(() => { /* execute only when I get the first emitted value */ })
)
.subscribe(() => {
// .....
})
Run Code Online (Sandbox Code Playgroud) 问题:
我正在研究一个包含多个研究和一组用户的项目,每个用户都参与其中的一项研究。每个研究都根据使用某种随机算法生成的列表将参与者分为两组。注册后,将为每个用户分配一个研究,他们的组由注册顺序和组列表中的相应索引确定。例如,如果研究的A
总席位为4
,而组列表是[0, 1, 1, 0]
将第一个用户分配给group 0
,则将第二个用户分配给,1
依此类推,直到研究完成。
在项目中定义了其他用户角色,即管理员,可以将其分配给多个研究,而无需占据研究的位置。这意味着用户与学习的关系是n:m
。
将用户分配给研究和研究组时,当前实施中出现的问题是竞争状况。该代码下面提供和它的工作方式是,它覆盖addUser
的Study
模式,只要用户添加到它会检查有多少用户已经在研究中学习,并为用户组列表这是当前指数seatsTaken
数。只要将用户定期添加到研究中,此方法就起作用。但是,无论何时同时添加多个用户,异步查询都会导致争用情况,并且该seatsTaken
计数会受到其他用户同时注册的影响。
在下面的示例中,分配给A
间隔学习的用户分配了正确的组,但B
同时查询的学习具有不正确的组分配。
const Sequelize = require('sequelize');
const assert = require('assert');
const sequelize = new Sequelize({
database: 'database',
username: 'username',
password: 'password',
dialect: process.env.DB_DIALECT || 'sqlite',
storage: 'db.sqlite',
logging: false
});
const User = sequelize.define('user', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
},
group: {
type: Sequelize.INTEGER,
allowNull: true, …
Run Code Online (Sandbox Code Playgroud)