es6 해독 - async 함수

3167 단어
  • async 함수는promise 대상을 되돌려줍니다
  •       function timeout(ms) {
              return new Promise((resolve) => {
                  setTimeout(resolve, ms);
              });
           }
    
          async function asyncPrint(value, ms) {
              await timeout(ms);
              console.log(value);
          }
    
          asyncPrint('hello world', 50);
    
         async  Promise  , await 。 , 
     :
         async function timeout(ms) {
              await new Promise((resolve) => {
                  setTimeout(resolve, ms);
              });
          }
    
          async function asyncPrint(value, ms) {
              await timeout(ms);
              console.log(value);
          }
    
        asyncPrint('hello world', 50);
    

    async 함수의 실현 원리

    async  ,  Generator  , 。
    
    async function fn(args) {
      // ...
    }
    
    //  
    
    function fn(args) {
      return spawn(function* () {
        // ...
      });
    }
    

    모든 async 함수는 위의 두 번째 형식으로 쓸 수 있는데, 그 중에서spawn 함수는 자동 집행기이다.
    다음은spawn 함수의 실현을 제시하는데 기본적으로 앞의 자동 집행기의 복제판이다.
    function spawn(genF) {
      return new Promise(function(resolve, reject) {
        const gen = genF();
        function step(nextF) {
          let next;
          try {
            next = nextF();
          } catch(e) {
            return reject(e);
          }
          if(next.done) {
            return resolve(next.value);
          }
          Promise.resolve(next.value).then(function(v) {
            step(function() { return gen.next(v); });
          }, function(e) {
            step(function() { return gen.throw(e); });
          });
        }
        step(function() { return gen.next(undefined); });
      });
    }
    

    비동기적으로 두루 다니다.

    const asyncIterable = createAsyncIterable(['a', 'b']);
    const asyncIterator = asyncIterable[Symbol.asyncIterator]();
    
    asyncIterator
    .next()
    .then(iterResult1 => {
      console.log(iterResult1); // { value: 'a', done: false }
      return asyncIterator.next();
    })
    .then(iterResult2 => {
      console.log(iterResult2); // { value: 'b', done: false }
      return asyncIterator.next();
    })
    .then(iterResult3 => {
      console.log(iterResult3); // { value: undefined, done: true }
    });
    

    async promise await 실행 순서

  • Promise는 setTimeout 매크로 작업보다 우선합니다.따라서 setTimeout 리셋은 마지막에 실행됩니다.
  • Promise가 정의되면 즉시 실행됩니다.
  • Promise의 Reject와 Resolve는 비동기적으로 실행되는 리셋입니다.따라서 리셋 대기열에 리셋 () 을 넣고 주 함수가 실행되기 전에 set Timeout을 호출합니다.
  • await가 실행되면 라인을 양보합니다.async 태그의 함수는 Promise 개체
  • 를 반환합니다.
    async function async1(){
      console.log('async1 start')
      await async2()
      console.log('async1 end')
    }
    async function async2(){
      console.log('async2')
    }
    console.log('script start')
    setTimeout(function(){
      console.log('setTimeout') 
    },0)  
    async1();
    new Promise(function(resolve){
      console.log('promise1')
      resolve();
    }).then(function(){
      console.log('promise2')
    })
    console.log('script end')
    

    위에서 설명한 대로 Chrome 66 및 node v10의 올바른 출력은 다음과 같습니다.
    script start
    async1 start
    async2
    promise1
    script end
    promise2
    async1 end
    setTimeout
    

    좋은 웹페이지 즐겨찾기