async/await 와 promise(nodejs 의 비동기 동작 문제)

예 를 들 어 글 의 상세 한 페이지 를 쓸 때의 한 장면:먼저 글 의 상세 한 내용 중의 PV 를 변경 한 다음 에 글 의 상세 한 상황 을 읽 은 다음 에 글 의 상세 한 내용 중의 글 Id 에 따라 이 글 의 평론 과 이 글 의 작성 자 정 보 를 조회 합 니 다.모든 데 이 터 를 가 져 온 후 글 의 상세 한 페이지 를 렌 더 링 합 니 다.데이터 베 이 스 를 조작 하 는 것 은 모두 비동기 적 인 것 이다.가장 직접적 으로 생각 하 는 방법 은 바로 한 층 한 층 의 반전 함수 이다.문제 가 생 겼 다.매우 보기 싫 고 층 이 조금 만 더 많 으 면 더 많은 번 거 로 움 이 있 을 것 이다.어떻게 해결 합 니까?업계 에서 비동기 적 인 조작 문 제 를 처리 하기 위해 서 는 어떤 async,q,bluebird,co 가 있 는 지,처리 방식 이 다 르 기 때문에 각각 천추 에 관심 이 있 는 지 알 아 볼 수 있 습 니 다.그러나 놀 라 운 발견 nodejs 7.6 은 ES7 중의 async/await 를 기본적으로 지원 하고 ES6 중의 promise 대상 과 결합 하여 사용 하 는 것 도 즐 겁 지 않 습 니 다.
Async/await 의 주요 장점 은 지옥(callback hell)문 제 를 피 할 수 있다 는 것 이다.
기본 개념:
async 는 이것 이 async 함수 임 을 표시 합 니 다.await 는 이 함수 에 만 사용 할 수 있 습 니 다.
await 는 promise 가 결 과 를 되 돌려 주 기 를 기다 리 고 계속 실행 하 겠 다 고 밝 혔 다.
await 뒤에 따 르 는 것 은 promise 대상 일 것 입 니 다.(물론 다른 반환 값 도 괜 찮 지만 그러면 의미 가 없습니다...)
예:
반환 값 가 져 오기:

var sleep = function (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      //    ‘ok'
      resolve('ok');
    }, time);
  })
};
var start = async function () {
  let result = await sleep(3000);
  console.log(result); //    ‘ok'
};
캡 처 오류:

var sleep = function (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      //      ,   ‘error'
      reject('error');
    }, time);
  })
};
var start = async function () {
  try {
    console.log('start');
    await sleep(3000); //            
    
    //             
    console.log('end');
  } catch (err) {
    console.log(err); //         `error`
  }
};
 순환 중:

var start = async function () {
  for (var i = 1; i <= 10; i++) {
    console.log(`    ${i}   ..`);
    await sleep(1000);
  }
};
재 순환 에서 사용 할 때 는 패 키 지 를 닫 을 필요 가 없 으 며,매번 순환 이 막 힐 수 있다.
앞에서 언급 한 장면:(종합 사용)

var showArticle = async function () {
    await new Promise(function (resolve, reject) {
      PostModel.incPv(postId, function (result) {
        resolve(result);
      });
    });// pv   1
    var post = await new Promise(function (resolve, reject) {
      PostModel.getPostById(postId, function (article) {
        resolve(article);
      });
    });//       
    await new Promise(function (resolve, reject) {
      userModel.getUserById(post.author,function (author) {
        post.author=author;
        resolve();
      })
    });//      
    var comments = await new Promise(function (resolve, reject) {
      CommentModel.getComments(post._id, function (comment) {
        resolve(comment);
      });
    });//          
    for(var i=0;i<comments.length;i++){
      await new Promise(function (resolve, reject) {
        userModel.getUserById(comments[i].author,function (author) {
          comments[i].author=author;
          resolve();
        })
      });//        
    }
    if (!post) {
      req.session.error = '      ';
      return res.redirect('/post');
    }
    res.render('post',{post: post, comments: comments});
  };
  showArticle();
위 에서 말 한 것 은 편집장 이 소개 한 async/await 와 promise(nodejs 의 비동기 조작 문제)입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기