node-mysql 비동기 조작 실현 (상)

node-mysql 비동기 조작을 실현하기 전에 JS에서의 비동기 조작에 대해 이야기합시다.ES6에서 Promise 객체 제공
Promise 객체의 세 가지 상태
4
  • pending(진행 중)
  • 4
  • fulfilled(성공)
  • 4
  • rejected(실패) 4
  • 상태 전환 또는 단방향 불가역 과정 pending->fulfilled pending->rejected
    기본 사용
    Promise 정의 후, Resolve와 Reject 두 개의 매개 변수가 있는데, 각각 pending->fulfilled 상태와 pending->rejected 상태에 대응한다
    //   
    const promise = new Promise(function(resolve, reject) {
      //        
      //     ,     
    
      if (/*        */){
        resolve(value);
      } else {
        reject(error);
      }
    });

    실행할 때, Resolve를 실행하든 Reject를 실행하든, 되돌아오는 것은 모두 Promise 대상입니다. Promise 대상의 값을 가져오려면 then에서 가져오십시오.then은 Promise 대상의 Resolve 매개 변수와 Reject 매개 변수에 대응하는 두 가지 함수가 있습니다
    //   
    promise.then(function(resolve){
        ...
    },function(reject){
        ...
    })

    아날로그 비동기 조작의 예
    const timeout = (ms) => {
        return new Promise((resolve, reject) => {
            resolve('done job')
        });
    }
    
    console.log(timeout(100)) // Promise { 'done job' }
    
    timeout(100).then(res => {
        console.log(res) // done job
    })

    곰곰이 생각해 보면promise 대상의 데이터는then에서 데이터를 얻을 수 있지만then이라는 체인 호출은 리셋 지옥을 초래할 수 있다. 동기화 함수처럼 조작해서timeout(100)을 직접 리셋 값으로 만들 수 있다면 더욱 좋다.ES2017 표준은 async 함수를 도입하여 async 함수에서 프로미스 대상을 사용하기 전에 await를 사용하면 프로미스 대상에서 데이터를 직접 얻을 수 있다.
    위의 예를 수정하다
    async 함수에서 인쇄한 값은then에서 인쇄한 값과 똑같습니다
    const timeout = (ms) => {
        return new Promise((resolve, reject) => {
            resolve('done job')
        });
    }
    
    console.log(timeout(100)) // Promise { 'done job' }
    
    timeout(100).then(res => {
        console.log(res) // done job
    })
    
    const getStr = async () => {
        const str = await timeout(100);
        console.log(str) // done job
    }
    
    getStr()

    좋은 웹페이지 즐겨찾기