비동기 유성 메서드 호출

10240 단어 asyncjavascriptmeteor
Meteor는 대부분 1.0 미만 프로젝트와도 이전 버전과 호환됩니다. 따라서 많은 코드가 여전히 콜백 기반입니다. Meteor.call 메서드도 마찬가지입니다. Promise 기반 접근 방식으로 쉽게 래핑할 수 있습니다.

export const callMethod = ({ name, args }) => 
  new Promise((resolve, reject) => {
    Meteor.call(name, args, (error, result) => {
      if (error) {
        return reject(error)
      }

      return resolve(result)
    })
})

Meteor.call는 여러 인수를 지원하지만 코드를 보다 표현적으로 유지하기 위해 명명된 인수와 함께 단일 개체를 전달하는 것을 선호합니다.

그런 다음 비동기 환경에서 기본적으로 callMethod를 사용할 수 있습니다.

Template.myTemplate.events({
  'click .some-button': async function (event, templateInstance) {
    const age = await callMethod({
      name: 'getAge', 
      args: { name: 'John Doe' }
    })
    console.log(age) // whatever the method returned
  }
})


또한 이러한 호출에 "연결"할 수 있으므로 콜백을 약속과 혼합하고 메서드 호출이 사용자 상호 작용의 일부일 때 적절한 UX 경험을 생성할 수 있습니다.

export const callMethod = ({ name, args, prepare, receive, success, failure }) => {
  // before call
  if (typeof prepare === 'function') {
    prepare()
  }

  // create the promise
  const promise = new Promise((resolve, reject) => {
    Meteor.call(name, args, (error, result) => {
      // on received
      if (typeof receive === 'function') {
        receive()
      }

      if (error) {
        return reject(error)
      }

      return resolve(result)
    })
  })

  // on success
  if (typeof success === 'function') {
    promise.then(success)
  }

  // on error
  if (typeof failure === 'function') {
    promise.catch(failure)
  }

  return promise
}


그런 다음 코드를 사용하여 예를 들어 "대기 중"표시기를 표시할 수 있습니다.

Template.myTemplate.events({
  'click .update-button': async function (event, templateInstance) {
   const updatedDoc = await callMethod({
     name: 'updateUser', 
     args: { name: 'John Doe', age: 42 },
     prepare: () => templateInstance.state.set('updating', true),
     receive: () => templateInstance.state.set('updating', false),
     failure: er => alert(er),
     success: () => alert('updated')
   })
   // process updatedDoc if desired
})

좋은 웹페이지 즐겨찾기