//异步函数promise化
function promisify(fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
return new Promise(function (resolve) {
args.push(function (result) {
resolve(result);
});
fn.apply(null, args)
})
}
}
// 定义锁
let redlock = {}
redlock.key = 'dailyRebateClock'
redlock.value = 0
redlock.timeout = 10 * 60 * 1000
let redis = {};
redis.lock = function (redlock) {
console.log('上锁')
setTimeout(() => {
return arguments[arguments.length - 1](redlock)
}, 2000)
}
redis.unlock = function (redlock) {
setTimeout(() => {
redis.set(redlock)
console.log('解锁')
return arguments[arguments.length - 1](redlock)
}, 500)
}
redis.set = function (redlock) {
if (redis.hasOwnProperty('redlock')) {
redis.redlock = redlock;
console.log('修改数据为', redis.redlock)
} else {
redis.redlock = redlock;
console.log('添加数据', redis.redlock)
}
}
promisify(redis.lock)(redlock)
.then((redlock) => {
return promisify(redis.unlock)(redlock)
})
.then((redlock) => {
redlock.value = 1
return promisify(redis.lock)(redlock)
})
.then((redlock) => {
return promisify(redis.unlock)(redlock)
})
.then((redlock) => {
redlock.value = 2
return promisify(redis.lock)(redlock)
})
.then((redlock) => {
return promisify(redis.unlock)(redlock)
})
反例:
// 会造成数据安全性问题
let redlock= {}
redlock.key = 'dailyRebateClock'
redlock.value = 0
redlock.timeout = 10 * 60 * 1000
const update = {
set(num) {
setTimeout(() => {
redlock.value = num;
console.log('修改数据为', redlock.value)
}, 1000 * Math.random())
return update
}
}
update.set(3).set(4).set(5).set(6).set(7).set(8).set(9)