수색…


소개

Async / await는 콜백 ( callback hell )이나 promise-chaining ( .then().then().then() )에 의존하지 않고 비동기 코드를 절차 적 방식으로 작성할 수있게 해주는 키워드 세트입니다.

이것은 await 키워드를 사용하여 약속의 해결까지 비동기 함수의 상태를 일시 중단하고 async 키워드를 사용하여 약속을 반환하는 비동기 함수를 선언하는 방식으로 작동합니다.

Async / await는 기본적으로 node.js 8에서 사용할 수 있으며, --harmony-async-await 플래그를 사용하여 7에서 사용할 수 --harmony-async-await .

Try-Catch 오류 처리를 사용하는 비동기 함수

async / await 구문의 가장 좋은 기능 중 하나는 동기식 코드를 작성하는 것처럼 표준 try-catch 코딩 스타일이 가능하다는 것입니다.

const myFunc = async (req, res) => {
  try {
    const result = await somePromise();
  } catch (err) {
    // handle errors here
  }
});

다음은 Express 및 promise-mysql 예제입니다.

router.get('/flags/:id', async (req, res) => {

  try {

    const connection = await pool.createConnection();

    try {
      const sql = `SELECT f.id, f.width, f.height, f.code, f.filename
                   FROM flags f
                   WHERE f.id = ?
                   LIMIT 1`;
      const flags = await connection.query(sql, req.params.id);
      if (flags.length === 0)
        return res.status(404).send({ message: 'flag not found' });

      return res.send({ flags[0] });

    } finally {
      pool.releaseConnection(connection);
    }

  } catch (err) {
    // handle errors here
  }
});

약속 및 비동기 / 대기 사이의 비교

약속을 사용하는 기능 :

function myAsyncFunction() {
    return aFunctionThatReturnsAPromise()
           // doSomething is a sync function
           .then(result => doSomething(result))
           .catch(handleError);
}

그래서 Async / Await가 우리의 기능을보다 깨끗하게하기 위해 행동을 취할 때입니다 :

async function myAsyncFunction() {
  let result;

  try {
      result = await aFunctionThatReturnsAPromise();
  } catch (error) {
      handleError(error);
  }

  // doSomething is a sync function
  return doSomething(result);
}

따라서 키워드 asyncreturn new Promise((resolve, reject) => {...} 것과 유사합니다.

그리고 await 당신의 결과를 얻을 유사 then 콜백.

여기에서 나는 그것을 본 후에 마음에 의문의 여지가없는 꽤 간단한 gif를 남긴다 :

GIF

콜백으로부터의 진행

처음에는 콜백이 있었고 콜백은 괜찮 았습니다.

const getTemperature = (callback) => {
  http.get('www.temperature.com/current', (res) => {
    callback(res.data.temperature)
  })
}

const getAirPollution = (callback) => {
  http.get('www.pollution.com/current', (res) => {
    callback(res.data.pollution)
  });
}

getTemperature(function(temp) {
  getAirPollution(function(pollution) {
    console.log(`the temp is ${temp} and the pollution is ${pollution}.`)
    // The temp is 27 and the pollution is 0.5.
  })
})

그러나 콜백과 관련된 몇 가지 실망한 문제가 있었으므로 우리 모두는 약속을 사용하기 시작했습니다.

const getTemperature = () => {
  return new Promise((resolve, reject) => {
    http.get('www.temperature.com/current', (res) => {
      resolve(res.data.temperature)
    })
  })
}

const getAirPollution = () => {
  return new Promise((resolve, reject) => {
    http.get('www.pollution.com/current', (res) => {
      resolve(res.data.pollution)
    })
  })
}

getTemperature()
.then(temp => console.log(`the temp is ${temp}`))
.then(() => getAirPollution())
.then(pollution => console.log(`and the pollution is ${pollution}`))
// the temp is 32
// and the pollution is 0.5

이것은 약간 더 좋았다. 마지막으로, 우리는 async / await를 발견했습니다. 후드에서 약속을 사용합니다.

const temp = await getTemperature()
const pollution = await getAirPollution()

실행을 기다리고 있습니다.

약속이 아무 것도 반환하지 않으면 비동기 작업은 await 사용하여 완료 될 수 await .

try{
    await User.findByIdAndUpdate(user._id, {
        $push: {
            tokens: token
        }
    }).exec()
}catch(e){
    handleError(e)
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow