JavaScript의 비동기식 작업
10715 단어 webprogrammingjavascriptnode
JavaScript는 단일 스레드의 동기화 언어입니다.Javascript는 이벤트 순환의 도움말 아래 병행성을 실현했다.사건 순환의 작업 원리는 놀랍지만 본문의 범위를 넘어섰다.나는 네가 가서 보라고 건의한다.그는 흥미로운 방식으로 이 점을 깊이 있게 해석했다.간단하게 말하자면, 이벤트 순환은 프로그램의 다른 작업을 병행적으로 실행하는 것처럼 보이지만, 사실은 그렇지 않다.비동기 코드와 동기 코드는 보기에 다르고 행위도 다르다.만약 조심하지 않으면, 예를 들어 정의되지 않은 비동기 조작을 사용했을 뿐만 아니라, 비동기 조작의 실제 값을 사용했을 수도 있다.
왜 안 동기화되지?
만약 우리가 동기화 조작만 한다면, 우리의 프로그램은 사용자 인터페이스가 조작 과정에서 응답하지 않을 것이다.API를 호출할 때마다 페이지와 상호작용을 하지 못하면 모든 사이트가 정체되고 화가 난다고 상상해 보세요.만약 프로그램이 일부 CPU의 무거운 작업을 처리하고 있다면, 다른 작업도 기다릴 수밖에 없습니다.이것은 생활하기에 적합한 좋은 세계가 아니다.
입력 출력 조작, 네트워크 호출은 비동기 조작의 몇 가지 예이다.
비동기 작업 처리
다른 메커니즘이 당신이 비동기적인 조작을 처리하는 것을 도울 수 있습니다.
답전
리셋은 비동기 작업이 끝난 후에 실행될 함수입니다.리셋을 비동기 조작에 전달하고 비동기 조작이 끝난 후에 이 함수를 호출합니다.
파일을 읽는 것을 예로 들자.이를 위해 fs module from Nodejs를 사용하겠습니다.
const fs = require('fs') // syntax to load a module
fs.readFile('/file-path', (err, data) => {
if (err) console.log(err)
console.log(data)
})
대부분의 조작에 대한 리셋에 있어서 주의해야 할 점은 그것들의 함수 서명이다.약속은 null/undefined 오류가 발생하면 첫 번째 파라미터가 오류 대상이 되고, 그렇지 않으면 두 번째 파라미터가 작업의 결과가 된다는 것이다.비록 리셋은 우리가 비동기적인 조작을 처리하는 것을 돕지만, 그것은 우리에게 또 다른 문제를 가져왔다. 리셋 지옥이다.
지옥으로 돌아가다
이 상황을 고려하면 파일 1이 있습니다. 그 이름은 데이터를 읽을 파일 2입니다.이 파일의 정확한 장면은 매우 이상하지만, API 호출을 처리할 때, 첫 번째 API 결과에 따라 두 번째 API를 호출해야 할 때, 보통 이런 상황이 발생한다.
const fs = require('fs') // syntax to load a module
fs.readFile('/file1', 'utf8', (err, file2) => {
if (err) console.log(err)
fs.readFile(`${file2}`, (err2, data) => {
if (err) console.log(err2)
console.log(data)
})
})
다른 작업을 수행해야 하는 경우 다른 콜백에는 콜백, 추가 콜백 등이 포함됩니다.코드가 보기, 디버깅하기 어려워졌다.코드 라이브러리의 증가에 따라 버그와 유지보수 문제가 발생할 것이다.언약
Promises는 리셋의 대체 방법으로 사용하려면 약속 대상을 되돌려 주는 함수가 필요하다.약속은 해결(성공) 또는 거절(오류가 발생했음), 끊기: 여전히 실행 중입니다.
이것은 문법을 더욱 간단하게 한다
readFile('file-path')
.then(res => {})
.catch(err => {})
. 그런 다음 () 및.catch () 는 또 하나의 약속을 되돌려줍니다. 그러면 then에서 다른 비동기 동작을 수행할 수 있고, 지옥을 겪지 않아도 됩니다.이거.catch () 블록은 데이터베이스에서 발생하는 모든 오류를 처리하는 데 도움을 줍니다.그리고 체인.
또한 일부 작업은 약속을 지원하지 않습니다. 본문을 작성할 때 fs모듈은 약속을 지원하지 않습니다. 이 문제를 해결하기 위해 차라리 이 문제를 둘러싸고 포장을 작성하고 fs-extranpm 패키지를 사용하거나 노드 8 및 이상 버전을 사용한다면 util.promisify() 방법을 사용하십시오.
const util = require('util')
const fs = require('fs')
const readFile = util.promisify(fs.readFile)
readFile('./test.txt', 'utf8')
.then(res => {
console.log('File data ', res)
})
.catch(err => {
console.log(err)
})
비동기식/대기
우리의 삶을 가볍게 해주겠다고 약속async await했지만 우리의 삶을 가볍게 해주겠다고 약속했다.이것은 서로 다른 문법으로 내부에 async awaitgenerators를 사용한다.
문법이 매우 간결하여 비동기 코드가 동기화되어 보인다.디버깅이 점점 간단해지면서 놀랍다.이 함수를 사용하는 데는 두 가지 절차가 있는데, 비동기 함수를 사용하기 전에 async 키워드를 사용하고, await 키워드를 사용하여 비동기 함수가 데이터를 되돌려 주기를 기다린다.비동기 함수에서만 await 키워드를 사용할 수 있습니다.
async function getData() {
let data = await readFile("./test.txt", "utf8");
console.log(data);
}
getData();
비동기식/대기 중 오류 처리
Async await는 약속일 뿐이기 때문에, 일반적인 약속처럼 다른 동작을 한 후에catch 블록을 연결할 수 있습니다.만약 네가 이것을 좋아하지 않는다면, 너도 전통적인try-catch 블록을 사용할 수 있다.
만약 node에서 시작한다면, 이 글이 도움이 되었으면 합니다. 다음 글에서, 우리는 비동기 코드가 API 호출을 처리할 때 얼마나 큰 도움이 되는지 이해할 것입니다.비동기식 운영 결과에 대한 문제가 발생하면 이러한 문제를 어떻게 처리하는지 확인하십시오.
만약 네가 좋아한다면 반드시 이 문장을 공유해야 한다.
Héctor J.Rivas의 Unsplash 표지 사진.
Reference
이 문제에 관하여(JavaScript의 비동기식 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kartik2406/async-operations-in-javascript-1k2c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)