>

파트너 관리자를 위해 일하고 있는데 현재 경쟁 조건이 있고 두 명의 클라이언트가 동시에 동일한 리소스를 호출 할 때 작동하지 않기 때문에 일부 코드는 원자 적이어야합니다. retrievePartners 메소드는 파트너를 리턴하며 해당 메소드는 원 자성이어야합니다. 기본 파트너는 제한된 리소스이며 제공 메커니즘은 한 번에 하나의 클라이언트 (파트너 요청) 만 처리해야합니다.

자바 코드는 기본적으로 javascript이기 때문에 아래 코드가 원자 연산에 효과적이라고 들었습니다.

let processingQueue = Promise.resolve();
function doStuffExclusively() {
  processingQueue = processingQueue.then(() => {
      return fetch('http://localhost', {method: 'PUT', body: ...});
  }).catch(function(e){
      throw e;
  });
  return processingQueue;
}
doStuffExclusively()
doStuffExclusively()
doStuffExclusively()

이 코드는 기본이지만 내 코드에는 다른 await 등을 호출하는 일부 대기가 있습니다. 나는 아래 코드에 그 메커니즘을 적용하고 싶지만 실제로 어떻게 해야할지 모르겠다. then 문 내에서 작업을 기다릴 수 없습니다.

또한 혼란스러워 코드 위의 처리 대기열에서 true를 반환합니다. 그러나 제 경우에는 배열을 반환하거나 오류 메시지를 발생시킵니다. 위와 같이 작동하도록 무언가를 반환해야합니다.

여기서 위 코드와 같이 원자를 만들고자하는 함수가 있습니다. return 문 전에이 함수의 모든 것을 then 섹션에 넣으려고 시도했지만 그 이후에는 작동하지 않았습니다.

export class Workout {
  constructor (config) {
    this.instructorPeer = new jet.Peer(config)
    this.instructorPeer.connect()
  }
  async createSession (partnerInfo) {
    const partners = { chrome: [], firefox: [], safari: [], ie: [] }
    const appropriatePartners = await this.retrievePartners(partnerInfo)
    Object.keys(appropriatePartners).forEach(key => {
      appropriatePartners[key].forEach(partner => {
        const newPartner = new Partner(this.instructorPeer, partner.id)
        partners[key].push(newPartner)
      })
    })
    return new Session(partners)
  }
  async retrievePartners (capabilities) {
    const appropriatePartners = { chrome: [], firefox: [], safari: [], ie: [] }
    const partners = await this.getAllPartners()
    // first check if there is available appropriate Partners
    Object.keys(capabilities.type).forEach(key => {
      let typeNumber = parseInt(capabilities.type[key])
      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)
            console.log(appropriatePartners[key].length)
          }
        })
        if (appropriatePartners[key].length < typeNumber) {
          throw new Error(
            'Sorry there are no appropriate Partners for this session'
          )
        }
      }
    })
    Object.keys(appropriatePartners).forEach(key => {
      appropriatePartners[key].forEach(partner => {
        this.instructorPeer.set('/partners/' + partner.id + '/states/', {
          isAvailable: false
        })
      })
    })
    return appropriatePartners
  }
  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
    }
  }
  const workoutServerConfig = {
    url: 'ws://localhost:8090'
  }
  const workout = createWorkout(workoutServerConfig)
  const session = await workout.createSession(capabilities)
  const session1 = await workout.createSession(capabilities)

여기에 내가 시도했지만 작동하지 않은 것은 세션이 정의되지 않은 것입니다.

let processingQueue = Promise.resolve()
    export class Workout {
  constructor (config) {
    this.instructorPeer = new jet.Peer(config)
    this.instructorPeer.connect()
this.processingQueue = Promise.resolve()
  }
  async createSession (partnerInfo) {
    this.processingQueue = this.processingQueue.then(() => {
      const partners = { chrome: [], firefox: [], safari: [], ie: [] }
      const appropriatePartners = this.retrievePartners(partnerInfo)
      Object.keys(appropriatePartners).forEach(key => {
        appropriatePartners[key].forEach(partner => {
          const newPartner = new Partner(this.instructorPeer, partner.id)
          partners[key].push(newPartner)
        })
      })
      return new Session(partners)
    })
  }

  • 답변 # 1

    이것은 다음과 같은 사실에 근거한 약속 기반 잠금입니다.

    1) .then()  처리기는 잠금이 해결 된 후에 만 ​​호출됩니다.

    2) 한 번 .then()  핸들러는 실행을 시작합니다. JS의 실행 모델로 인해 다른 JS 코드는 실행되지 않습니다.

    당신이 인용 한 접근법의 전체 구조는 정확합니다.

    코드에서 볼 수있는 주요 문제는 const appropriatePartners = this.retrievePartners(partnerInfo) 입니다.   retrievePartners 때문에 약속으로 평가됩니다  비동기입니다. 원하는 :

    const appropriatePartners = await this.retrievePartners(partnerInfo) .

    이로 인해 잠금 실행기가 retrievePartners 에서 차단됩니다.  call, 반면 현재는 단순히 call의 최종 반환 값을 약속하는 랩핑을 잡습니다.

    편집 : 예제는 jsfiddle을 참조하십시오.

    요약 :

    1) 화살표 기능 처리 잠금 해상도 async 만들기  

    2) await 확인 this.retrievePartners 의 리턴 값 그렇지 않으면 해결 된 값이 아닌 약속에 따라 운영됩니다.

  • 이전 wso2 - wso2iot - android 용 새 모바일 앱 만들기
  • 다음 c# - MS Fakes 객체의 반환 값을 설정하는 방법은 무엇입니까?