js异步函数promise化

//异步函数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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值