正如@svaj 所说,您可以使用自定义对象获取客户或订单的序列号。由于版本,自定义对象将充当锁,避免两个并发请求可能获得相同的数字。如果出现并发错误,您也可以使用递归重试。
这是 ES6 中的一个工作示例(同样适用于订单号)。您唯一需要设置的是 sequence 的名称,它将成为自定义对象的容器和键(例如“customerSequence”)。
setCustomerNumber({ sequence, value, version }) {
return customObjectsService
.save({
container: sequence,
key: sequence,
value,
version,
})
.then(customObject => customObject.value);
},
getCustomerNumber(sequence) {
return customObjectsService
.find({ where: `key="${sequence}"` })
.then(({ results }) => (results.length ? results[0] : { value: 0 }))
.then(lastValue => {
return this.setCustomerNumber({
sequence,
value: lastValue.value + 1,
version: lastValue.version,
}).catch(() => this.getCustomerNumber(sequence)); // We request a new one on error
});
},
这里你有前面代码的单元测试
describe('when getting the next customer number', () => {
const sequence = 'customersSequence';
describe('when existing previous customer number', () => {
const oldCustomerNumber = 1;
const newCustomerNumber = oldCustomerNumber + 1;
const version = 1;
beforeEach(() => {
spyOn(customObjectsService, 'find').and.returnValue(
Promise.resolve({
results: [
{
value: oldCustomerNumber,
version,
},
],
total: 1,
}),
);
spyOn(customersService, 'setCustomerNumber').and.returnValue(
Promise.resolve(newCustomerNumber),
);
});
it('should get a customer number equals to <previous customer number> + 1', done => {
customersService
.getCustomerNumber(sequence)
.then(customerNumber => {
expect(customObjectsService.find).toHaveBeenCalledWith({
where: `key="${sequence}"`,
});
expect(customersService.setCustomerNumber).toHaveBeenCalledWith({
sequence,
value: newCustomerNumber,
version,
});
expect(customerNumber).toBe(newCustomerNumber);
})
.then(done, done.fail);
});
});
describe('when NOT existing previous customer number', () => {
const newCustomerNumber = 1;
beforeEach(() => {
spyOn(customObjectsService, 'find').and.returnValue(
Promise.resolve({
results: [],
total: 0,
}),
);
spyOn(customersService, 'setCustomerNumber').and.returnValue(
Promise.resolve(newCustomerNumber),
);
});
it('should get a customer number equals to 1', done => {
customersService
.getCustomerNumber(sequence)
.then(customerNumber => {
expect(customObjectsService.find).toHaveBeenCalledWith({
where: `key="${sequence}"`,
});
expect(customersService.setCustomerNumber).toHaveBeenCalledWith({
sequence,
value: newCustomerNumber,
version: undefined,
});
expect(customerNumber).toBe(newCustomerNumber);
})
.then(done, done.fail);
});
});
});