웹 프론트엔드 JS 튜토리얼 NodeJs는 async 및 wait를 통해 비동기 메서드를 처리합니다.

NodeJs는 async 및 wait를 통해 비동기 메서드를 처리합니다.

Jan 26, 2018 am 09:17 AM
await javascript nodejs

Express 백엔드를 작성할 때 많은 비동기 IO를 처리해야 하는 경우가 많습니다. 고대에는 우리 모두가 Chunk 함수를 사용했습니다. 이 함수는 기본 첫 번째 매개변수가 error인 가장 친숙한 함수입니다. Mongo 데이터베이스의 작동을 시뮬레이션하고 이에 대한 느낌을 살펴보겠습니다. error的函数。我们来模拟一个Mongo数据库的操作,感受一下。

本文主要介绍NodeJs通过async/await处理异步的方法,内容挺不错的,现在分享给大家,也给大家做个参考,希望能帮助到大家。


mongoDb.open(function(err, db){
  if(!err){
    db.collection("users", function(err, collection){
      if(!err){
        let person = {name: "yika", age: 20};
        collection.insert(person, function(err, result){
          if(!err){
            console.log(result);
          }
        });
      }
    })
  }
});
로그인 후 복사

这个也就是被我们所诟病的callback hell,一堆横向金字塔,如果将回调拆分成函数,则会变得非常支离破碎。为了防止到恶心到大家,我甚至没有写关于错误的处理,正常来说,每一个异步的操作都需要都它的error进行相应的显示或处理的。

Promise时代

后来进入了好一点的时代就是Promise,我们也可以称作链式操作。关于Promise,我也是之前有专门写过一系列的博文,有兴趣可以回头翻一下。这里来看看,将以上改写之后的状况。


let person = {name: "yika"};
mongoDb
  .open()
  .then(function(database){
   return database.collection("users");
  })
  .then(function(collection){
   return collection.insert(person);
  })
  .then(function(result){
   console.log(result);
  })
  .catch(function(e){
   throw new Error(e);
  })
로그인 후 복사

我们可以看到,我们将金字塔已经平铺成一条线状结构了。相比之前恶心难以维护的chunk函数,变成了promise函数,并且错误的处理也变得十分优雅。但是我们仍然不可忽视某些问题,例如我们必须忍受各个逻辑被一个又一个的then()包裹起来,每一个函数都有其独立的作用域,如果为了共享某个数据就必须挂在最外层,最重要的还是,它与我们熟悉的同步编程仍然有差别。

Generator时代

TJ大神,借着ES6的Generator迭代器,最早实现了异步编程同步化的功能,也就是最为我们所熟知的co库。我们通过co(function *(){})可以使函数内部通过迭代器来控制。而co在这里则是充当了启动器的角色。关于Generator和co我在之前的博文也同样说过。


let co = require("co");

co(function *(){
  let db, collection, result; 
  let person = {name: "yika"};
  try{
    db = yield mongoDb.open();
    collection = yield db.collection("users");
    result = yield collection.insert(person);
  }catch(e){
    console.error(e.message);
  }
  console.log(result);
});
로그인 후 복사

我们已经非常接近同步编程了,在co包裹的函数内部,只有一个异步执行完毕,才会继续执行下面的代码。并且错误的处理也是通过try and catch进行实现的。不过我们不得不承认的是,迭代器终究不是为异步而存在的。里面的yield*的语义也并不代表的就是异步函数标志。并且迭代器是需要co去驱动的,它和我们想象中的函数多少有一点点不同。

async/await时代

我们关注到ES7的async/await,才发现这才是我们想要的!我们将上面的代码小小改写一下。


async function insertData(person){
  let db, collection, result; 
  try{
    db = await mongoDb.open();
    collection = await db.collection("users");
    result = await collection.insert(person);
  }catch(e){
    console.error(e.message);
  }
  console.log(result);
} 

insertData({name: "yika"});
로그인 후 복사

我们可以看到inserData是一个真正的函数,是我们可以直接去调用而无需启动器驱动的。当然内部我们也可以感受到处理yield变成了await

이 기사는 주로 NodeJ가 async/await를 통해 비동기 처리를 처리하는 방법을 소개합니다. 이제 내용이 꽤 좋아 여러분에게 도움이 되기를 바랍니다.

$ npm install babel-core --save
$ npm install babel-preset-es2015 --save
$ npm install babel-preset-stage-3 --save
로그인 후 복사
이것이 우리가 수평 피라미드 무리인 콜백 지옥을 비판한 것입니다. 콜백이 함수로 분할되면 매우 조각화됩니다. 모든 사람이 혐오감을 느끼는 것을 방지하기 위해 오류 처리에 대해서는 글도 쓰지 않았습니다. 일반적으로 모든 비동기 작업은 그에 따라 오류를 표시하거나 처리해야 합니다.


Promise Era


이후 우리는 체인 운영이라고도 할 수 있는 더 나은 Promise 시대를 맞이했습니다. Promise에 관해서는 이전에 일련의 블로그 게시물을 작성한 적이 있습니다. 관심이 있으시면 다시 읽어보실 수 있습니다. 위의 내용을 다시 작성한 후 상황을 살펴보겠습니다.

// webpack.config.js
// 省略上面的文件输入输出的配置,直接看模块加载器的配置
module: {
  loaders: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      loader: "babel",
      query: {
       presets: ['es2015', 'stage-3']
      }
    },
  ]
}
로그인 후 복사

피라미드를 선형 구조로 편평화한 것을 볼 수 있습니다. 역겹고 유지 관리가 어려웠던 이전 청크 함수에 비해 약속 함수가 되었으며 오류 처리가 매우 우아해졌습니다. 하지만 여전히 특정 문제를 무시할 수는 없습니다. 예를 들어, 각 함수는 특정 데이터를 공유하기 위해 자신만의 독립적인 범위를 가지고 있습니다. 가장 바깥쪽 레이어에 매달려 있어야 합니다. 가장 중요한 것은 우리가 익숙한 동기식 프로그래밍과 여전히 다르다는 것입니다.

Generator 시대

Master TJ는 ES6의 Generator Iterator를 통해 가장 잘 알려진 co 라이브러리인 비동기 프로그래밍의 동기화 기능을 최초로 구현했습니다. co(function *(){})를 사용하여 반복자를 통해 내부적으로 함수를 제어할 수 있습니다. 그리고 여기서는 co가 런처 역할을 합니다. 나는 이전 블로그 게시물에서 Generator와 Co에 대해 동일한 말을 했습니다.

// index.js 
// 用于引入babel,并且启动app.js

require("babel-core/register");
require("./app.js");
로그인 후 복사
로그인 후 복사

co로 래핑된 함수 내에서는 다음 코드가 계속 실행되기 전에 단 하나의 비동기 실행만 완료됩니다. 그리고 오류 처리도 try and catch를 통해 구현됩니다. 그러나 우리가 인정해야 할 것은 결국 비동기성을 위한 반복자가 존재하지 않는다는 것입니다. yield*의 의미는 비동기 함수 플래그를 나타내지 않습니다. 그리고 반복자는 co에 의해 구동되어야 하는데, 이는 우리가 상상했던 함수와 조금 다릅니다.

async/await 시대


우리는 ES7의 async/await에 주의를 기울였지만 이것이 우리가 원하는 것임을 알게 되었습니다! 위의 코드를 살짝 다시 작성해 보겠습니다.


🎜🎜
{
 "presets": ["stage-3", "es2015"]
}
로그인 후 복사
로그인 후 복사
🎜 inserData가 런처 드라이버 없이 직접 호출할 수 있는 실제 함수임을 알 수 있습니다. 물론 내부적으로도 yield의 처리가 await가 되는 것 외에는 큰 차이가 없다고 느낄 수도 있습니다. async/await는 비동기 프로그래밍의 의미에 더 가깝습니다. 🎜🎜그럼 질문은 어떻게 사용하느냐 입니다. 🎜🎜🎜사용 🎜🎜🎜처음부터 babel이 async Transform을 지원한다고 했으니 사용할 때 babel만 도입하면 됩니다. 물론, 서버 측과 브라우저 측의 처리 방법이 다를 수 있습니다. 시작하기 전에 필요한 async/await 컴파일 파일이 포함된 다음 패키지를 소개해야 합니다. 🎜🎜🎜🎜🎜rrreee🎜🎜브라우저 측🎜🎜🎜Babel은 원래 오래된 브라우저가 새로운 ES6 기능을 지원하고 개발 경험을 향상시킬 수 있도록 등장했습니다. 그래서 Babel은 처음부터 babel-cli 터미널을 통해 컴파일이 가능합니다. 또는 브라우저 측에서 컴파일할 바벨 파일을 도입하세요. 물론 이것들은 제가 가장 추천하는 것들이 아니므로 그냥 생략하겠습니다. 프런트엔드 정적 리소스 구성에서는 webpack이 현재 더 나은 솔루션입니다. 이는 정적 리소스의 모듈 종속성, 패키징 및 병합, 언어 전처리를 지원합니다. 물론 여기서는 바벨 처리를 참조합니다. 🎜🎜🎜🎜🎜rrreee🎜그래서 우리가 즐겁게 사용할 수 있어요. 🎜🎜🎜서버 측🎜🎜🎜상대적으로 말하면 백엔드는 프런트엔드보다 훨씬 더 많은 비동기 IO를 처리해야 하며 이 또한 더 필요합니다. 그렇다면 서버 측에 바벨을 어떻게 도입할까요? 🎜🎜사실 가장 간단하면서도 가장 번거로운 방법은 js 파일을 Babel을 통해 직접 컴파일해서 새 파일을 생성한 후 사용하는 것입니다. 물론 중복된 파일은 불가피합니다. 눈에 띄지 않게, 다른 방법을 시도해 보겠습니다. 🎜🎜공식적으로 제공되는 require Hook 방식을 사용합니다. 이름에서 알 수 있듯이 require를 통해 들어온 후 필요할 때 다음 파일을 Babel에서 처리합니다. CommonJs가 동기식 모듈 종속성이라는 것을 알고 있기 때문에 실행 가능한 방법이기도 합니다. 시작을 위해서는 실제로 프로그램을 실행하는 js 파일이 하나 더 필요합니다. 🎜🎜🎜🎜🎜
// index.js 
// 用于引入babel,并且启动app.js

require("babel-core/register");
require("./app.js");
로그인 후 복사
로그인 후 복사

配置完hook之后,我们就配置babel的.babelrc文件,它是一个json格式的文件。es2015看情况配置,如果是已经是Node5.0版本,就无需再进行编译。


{
 "presets": ["stage-3", "es2015"]
}
로그인 후 복사
로그인 후 복사

最后我们的异步函数代码,写在app.js里即可。

相关推荐:

小程序开发之利用co处理异步流程的实例教程

如何处理异步队列出错?

以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题_jquery

위 내용은 NodeJs는 async 및 wait를 통해 비동기 메서드를 처리합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

nodejs는 백엔드 프레임워크인가요? nodejs는 백엔드 프레임워크인가요? Apr 21, 2024 am 05:09 AM

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

nodejs를 mysql 데이터베이스에 연결하는 방법 nodejs를 mysql 데이터베이스에 연결하는 방법 Apr 21, 2024 am 06:13 AM

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

nodejs의 전역 변수는 무엇입니까 nodejs의 전역 변수는 무엇입니까 Apr 21, 2024 am 04:54 AM

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? Apr 21, 2024 am 05:18 AM

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

nodejs와 java 사이에 큰 차이가 있나요? nodejs와 java 사이에 큰 차이가 있나요? Apr 21, 2024 am 06:12 AM

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

nodejs는 백엔드 개발 언어인가요? nodejs는 백엔드 개발 언어인가요? Apr 21, 2024 am 05:09 AM

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

nodejs 프로젝트를 서버에 배포하는 방법 nodejs 프로젝트를 서버에 배포하는 방법 Apr 21, 2024 am 04:40 AM

Node.js 프로젝트의 서버 배포 단계: 배포 환경 준비: 서버 액세스 권한 획득, Node.js 설치, Git 저장소 설정. 애플리케이션 빌드: npm run build를 사용하여 배포 가능한 코드와 종속성을 생성합니다. Git 또는 파일 전송 프로토콜을 통해 서버에 코드를 업로드합니다. 종속성 설치: SSH를 서버에 연결하고 npm install을 사용하여 애플리케이션 종속성을 설치합니다. 애플리케이션 시작: node index.js와 같은 명령을 사용하여 애플리케이션을 시작하거나 pm2와 같은 프로세스 관리자를 사용합니다. 역방향 프록시 구성(선택 사항): Nginx 또는 Apache와 같은 역방향 프록시를 사용하여 트래픽을 애플리케이션으로 라우팅합니다.

nodejs와 java 중 어느 것을 선택해야 합니까? nodejs와 java 중 어느 것을 선택해야 합니까? Apr 21, 2024 am 04:40 AM

Node.js와 Java는 각각 웹 개발에 장단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. Node.js는 실시간 애플리케이션, 신속한 개발 및 마이크로서비스 아키텍처에 탁월한 반면, Java는 엔터프라이즈급 지원, 성능 및 보안에 탁월합니다.

See all articles