如何防止javascript中的竞争条件?

时间:2018-04-05 12:00:22

标签: javascript atomic race-condition

我正在使用资源管理器,有些工作必须是原子,因为可能存在竞争条件。

我看到类似帖子中提供了解决方案 的 Javascript semaphore / test-and-set / lock?

表示implement a basic integer semaphore, just add the variable into the DOM and lock/unlock it and make sure your functions keep checking it, else timeout them

有人可以帮助我吗如何为以下代码实现?如何向DOM添加变量?

在下面的代码中,retrievePartners方法根据用户在功能对象中询问的方式返回合作伙伴,而retrievePartners方法可能已经被其他用户同时调用,要求相同的合作伙伴(浏览器)。所以这方法应该是原子的,意味着应该同时只处理一个功能。

  async retrievePartners (capabilities) {
    const appropriatePartners = { chrome: [], firefox: [], safari: [], ie: [] }
    const partners = await this.getAllPartners()
    allTypeNumber = 0
    // first check if there is available appropriate Partners
    Object.keys(capabilities.type).forEach(key => {
      let typeNumber = parseInt(capabilities.type[key])
      allTypeNumber = allTypeNumber + typeNumber
      for (let i = 0; i < typeNumber; i++) {
        partners.forEach((partner, i) => {
          if (
            key === partner.value.type &&
            partner.value.isAvailable &&
            appropriatePartners[key].length < typeNumber
          ) {
            appropriatePartners[key].push(partner)
          }
        })

        if (appropriatePartners[key].length < typeNumber) {
          throw new Error(
            'Sorry there are no appropriate Partners for this session'
          )
        }
      }
    })

    if (allTypeNumber === 0) {
      throw new Error('Please mention at least 1 type of browser !')
    } else {
      Object.keys(appropriatePartners).forEach(key => {
        appropriatePartners[key].forEach(partner => {
          this.instructorPeer.set('/partners/' + partner.id + '/states/', {
            isAvailable: false
          })
        })
      })

      return appropriatePartners
    }
  }

getAllPartners方法

  async getAllPartners (capabilities) {
    const partners = []
    const paths = await this.instructorPeer.get({
      path: { startsWith: '/partners/' }
    })
    paths.forEach((path, i) => {
      if (path.fetchOnly) {
        let obj = {}
        obj.value = path.value
        obj.id = path.path.split('/partners/')[1]
        obj.value.isAvailable = paths[i + 1].value.isAvailable
        partners.push(obj)
      }
    })
    return partners
  }

以下是我如何调用方法

async function startTest () {
  const capabilities = {
    type: {
      chrome: 1
    }
  }

  test('Example test', async t => {
    try {
      session = await workout.createSession(capabilities)
      const partners = session.partners
      const partner = partners.chrome[0]
...

0 个答案:

没有答案