JavaScript-同期と非同期
29039 ワード
# Call Back
javascriptは同期されているため、信号が送信された後から作成された順序で同期して実行されます.
ハウスティンとは何ですか.var変数または関数宣言が上に移動されます.
これは一般的な同期関数です.関数を宣言し、呼び出し直後に必要な結果を表示します.
ひどうきかんすう
関数を宣言するときに、パラメータとして必要な値と遅延時間を受け入れます.Promise
javascriptは同期されているため、信号が送信された後から作成された順序で同期して実行されます.
ハウスティンとは何ですか.var変数または関数宣言が上に移動されます.
"Synchronous callback"
これは一般的な同期関数です.関数を宣言し、呼び出し直後に必要な結果を表示します.
function printImmediately(print) {
print();
}
printImmediately(()=> console.log('hello'));
"Asynchronous callback"
ひどうきかんすう
関数を宣言するときに、パラメータとして必要な値と遅延時間を受け入れます.
function printWIthDelay(print, timeout) {
setTimeout(print, timeout);
}
printWithDelay(()=> console.log('async callback'), 2000);
Promise
非同期アクションの実行
重要なポイント!
1.ステータスの理解
state:pending(承諾が作成され、操作が実行されました)
->完了(操作完了)または却下(問題発生)
2.生産者(情報提供者)と消費者(情報消費)の違いを知る
"Producer"
promiseという클래스
を使って作ってみます.//1.Producer
//new Promise가 생성될 때, executor는 바로 실행된다. 이에 주의해서 사용해야 한다.
const promise = new Promise((resolve, reject) => {
console.log('doing something..'); //즉시 console 출력
setTimeout(()=> {
resolve('jev'); // 성공했을 때
//reject(new Error('no network')); // 실패했을 때
}, 2000);
});
promise
.then(value=> {console.log(value)}) // value는 promise 객체가 선언한 resolve의 인자인 'jev'를 받는다.
//catch(error => {console.log(error)}) // error는 promise 객체가 선언한 reject의 인자인 new Error를 받는다.
//finally(() => {console.log('finally')}) // 성공하든 실패하든 상관없이 출력
"Promise Chaining"
const fetchNumber = new Promise((resolve, reject)=> {setTimeout(()=> resolve(1), 1000)})
fetchNumber
.then(num=> num*2) // 2 after 1sec
.then(num=> num*3) // 6 after 1sec
.then(num => { // 값을 출력시켜도 되고, 비동기인 promise를 전달해도 됨.
return new Promise((resolve, reject)=> {
setTimeout(()=> resolve(num-1), 1000)})})
.then(num=> console.log(num)) // 5 after 1sec
//이렇게 알아볼 수 있듯이 .then으로 인자를 계속 연결하면서 이을수 있다.
//다른 예를 통해 다시한번 이해해보자.
const getHen= () =>
new Promise((resolve, reject)=> {
setTimeout(()=> resolve('닭'), 1000)})
const getEgg = hen =>
new Promise((resolve, reject)=> {
setTiemout(()=> resolve(`${hen}=> '계란'`), 1000)})
const cook = egg =>
new Promise((resolve, reject)=> {
setTimeout(()=> resolve(`${egg}=> '후라이'`), 1000)})
getHen()
//인자 없이 'getEgg'로만 표현가능.
.then(hen=> getEgg(hen)) //닭=> 계란
//인자 없이 'cook'로만 표현가능.
.then(egg=> cook(egg)) //닭=> 계란=> 후라이
//인자 없이 'console.log'로만 표현가능.
.then(meal=> console(meal)) //닭=> 계란=> 후라이 after 3sec
Async / Await
コミットメントをシンプル、シンプル、同期化
async、awaitを使用すると、同期作成のように簡単に作成できます.
"Async"
//기존 promise 함수를 이용한 경우
function fetchUser() {
return new Promise(resolve,reject)=> {
resolve('jev')})
fetchUser()
.then(console.log)
//async를 이용한 경우
async function fetchUser() {
return 'jev';)
fetchUser()
.then(console.log)
"Await"
async function getApple() {
await delay(1000);
return 'apple';} // 1초 뒤에 apple을 resolve 한다.
async function getBanana() {
await delay(1000);
return 'banana';} // 1초 뒤에 banana를 resolve 한다.
//이제 기존 방식대로 'apple'과'banana'를 출력하기.
function pickFruits() {
return getApple.then(apple=> {
return getBanana.then(banana=> `${apple}+${banana}`)})}
pickFruits.then(console.log); // 2초 뒤 apple+banana 출력
//async를 이용하여 'apple'과 'banana'를 출력하기.
async function pickFruits() {
const apple = await getApple();
const banana = await getBanana();
return `${apple}+${banana}`}
pickFruits().then(console.log) // 2초 뒤 apple+banana 출력
//병렬적으로 async 사용하기
async function pickFruits() {
//promise를 통해 각각 함수들을 불러오고, await을 통해 각 함수들 출력
const applePromise = getApple(); // promise는 선언하는 순간 실행
const bananaPromise = getBanana();
const apple = await getApple();
const banana = await getBanana();
return `${apple}+${banana}`}
pickFruits().then(console.log) // 1초 뒤 apple+banana 2번 출력
//병렬적으로 유용하게 Promise APIs를 통해 사용하기
function pickAllFruits() {
return Promise.all([getApple(), getBanana()]).then(fruits=> fruits.join('+'))}
pickAllfruits.then(console.log) // 1초 뒤 apple+banana 2번 출력
操作KEY WORDS
"chrome v"
Chromeブラウザの一部としてのエンジン.このエンジンによりjavascriptコードを解釈して実行することができます.
"runtime environment"
Webブラウザはjsエンジンだけでなく、ブラウザが提供するjsランタイム環境もweb api、queue、event loopなどからなるため、非同期で実行できます.
また,同期性を保証する非同期および非ブロック操作は,JavaScriptエンジンを駆動するランタイム環境で行う.(ブラウザまたはノード)
非同期操作を実行すると、コードがスタックされ、呼び出しスタックで実行されます.1.javascriptのエンジン委任->web api
2.webapi非同期タスクの実行->テクノロジーキューへの配信.(イベントループ経由)
3.callスタックにスタックされた関数がない場合、イベントループは、技術キューで待機しているcallback関数をcallスタックに渡します.
4.スタックされたcallback関数をcallスタックで実行し、callスタックから削除します.
「jsエンジン」
Webページのjsコード解析構文を受信し、構文エラーがなければ実行可能コマンドに変換します.memory heapとcall stackからなる.タスクを処理すると、メインスレッドから呼び出された関数がcallスタックに蓄積されます.
すなわち、単一スレッドベースの言語には、プライマリスレッドと呼び出しスタックがあります.
[ソース]
https://www.youtube.com/watch?v=aoQSOZfz3vQ&ab_channel=%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9by%EC%97%98%EB%A6%AC
https://medium.com/@vdongbin/javascript-%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC-single-thread-event-loop-asynchronous-e47e07b24d1c
https://prohannah.tistory.com/59
https://dkje.github.io/2020/09/20/AsyncAndEventLoop/
Reference
この問題について(JavaScript-同期と非同期), 我々は、より多くの情報をここで見つけました
https://velog.io/@jeveloper/TIL-JavaScript-동기비동기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
//1.Producer
//new Promise가 생성될 때, executor는 바로 실행된다. 이에 주의해서 사용해야 한다.
const promise = new Promise((resolve, reject) => {
console.log('doing something..'); //즉시 console 출력
setTimeout(()=> {
resolve('jev'); // 성공했을 때
//reject(new Error('no network')); // 실패했을 때
}, 2000);
});
promise
.then(value=> {console.log(value)}) // value는 promise 객체가 선언한 resolve의 인자인 'jev'를 받는다.
//catch(error => {console.log(error)}) // error는 promise 객체가 선언한 reject의 인자인 new Error를 받는다.
//finally(() => {console.log('finally')}) // 성공하든 실패하든 상관없이 출력
const fetchNumber = new Promise((resolve, reject)=> {setTimeout(()=> resolve(1), 1000)})
fetchNumber
.then(num=> num*2) // 2 after 1sec
.then(num=> num*3) // 6 after 1sec
.then(num => { // 값을 출력시켜도 되고, 비동기인 promise를 전달해도 됨.
return new Promise((resolve, reject)=> {
setTimeout(()=> resolve(num-1), 1000)})})
.then(num=> console.log(num)) // 5 after 1sec
//이렇게 알아볼 수 있듯이 .then으로 인자를 계속 연결하면서 이을수 있다.
//다른 예를 통해 다시한번 이해해보자.
const getHen= () =>
new Promise((resolve, reject)=> {
setTimeout(()=> resolve('닭'), 1000)})
const getEgg = hen =>
new Promise((resolve, reject)=> {
setTiemout(()=> resolve(`${hen}=> '계란'`), 1000)})
const cook = egg =>
new Promise((resolve, reject)=> {
setTimeout(()=> resolve(`${egg}=> '후라이'`), 1000)})
getHen()
//인자 없이 'getEgg'로만 표현가능.
.then(hen=> getEgg(hen)) //닭=> 계란
//인자 없이 'cook'로만 표현가능.
.then(egg=> cook(egg)) //닭=> 계란=> 후라이
//인자 없이 'console.log'로만 표현가능.
.then(meal=> console(meal)) //닭=> 계란=> 후라이 after 3sec
コミットメントをシンプル、シンプル、同期化
async、awaitを使用すると、同期作成のように簡単に作成できます.
"Async"
//기존 promise 함수를 이용한 경우
function fetchUser() {
return new Promise(resolve,reject)=> {
resolve('jev')})
fetchUser()
.then(console.log)
//async를 이용한 경우
async function fetchUser() {
return 'jev';)
fetchUser()
.then(console.log)
"Await"
async function getApple() {
await delay(1000);
return 'apple';} // 1초 뒤에 apple을 resolve 한다.
async function getBanana() {
await delay(1000);
return 'banana';} // 1초 뒤에 banana를 resolve 한다.
//이제 기존 방식대로 'apple'과'banana'를 출력하기.
function pickFruits() {
return getApple.then(apple=> {
return getBanana.then(banana=> `${apple}+${banana}`)})}
pickFruits.then(console.log); // 2초 뒤 apple+banana 출력
//async를 이용하여 'apple'과 'banana'를 출력하기.
async function pickFruits() {
const apple = await getApple();
const banana = await getBanana();
return `${apple}+${banana}`}
pickFruits().then(console.log) // 2초 뒤 apple+banana 출력
//병렬적으로 async 사용하기
async function pickFruits() {
//promise를 통해 각각 함수들을 불러오고, await을 통해 각 함수들 출력
const applePromise = getApple(); // promise는 선언하는 순간 실행
const bananaPromise = getBanana();
const apple = await getApple();
const banana = await getBanana();
return `${apple}+${banana}`}
pickFruits().then(console.log) // 1초 뒤 apple+banana 2번 출력
//병렬적으로 유용하게 Promise APIs를 통해 사용하기
function pickAllFruits() {
return Promise.all([getApple(), getBanana()]).then(fruits=> fruits.join('+'))}
pickAllfruits.then(console.log) // 1초 뒤 apple+banana 2번 출력
操作KEY WORDS
"chrome v"
Chromeブラウザの一部としてのエンジン.このエンジンによりjavascriptコードを解釈して実行することができます.
"runtime environment"
Webブラウザはjsエンジンだけでなく、ブラウザが提供するjsランタイム環境もweb api、queue、event loopなどからなるため、非同期で実行できます.
また,同期性を保証する非同期および非ブロック操作は,JavaScriptエンジンを駆動するランタイム環境で行う.(ブラウザまたはノード)
非同期操作を実行すると、コードがスタックされ、呼び出しスタックで実行されます.1.javascriptのエンジン委任->web api
2.webapi非同期タスクの実行->テクノロジーキューへの配信.(イベントループ経由)
3.callスタックにスタックされた関数がない場合、イベントループは、技術キューで待機しているcallback関数をcallスタックに渡します.
4.スタックされたcallback関数をcallスタックで実行し、callスタックから削除します.
「jsエンジン」
Webページのjsコード解析構文を受信し、構文エラーがなければ実行可能コマンドに変換します.memory heapとcall stackからなる.タスクを処理すると、メインスレッドから呼び出された関数がcallスタックに蓄積されます.
すなわち、単一スレッドベースの言語には、プライマリスレッドと呼び出しスタックがあります.
[ソース]
https://www.youtube.com/watch?v=aoQSOZfz3vQ&ab_channel=%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9by%EC%97%98%EB%A6%AC
https://medium.com/@vdongbin/javascript-%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC-single-thread-event-loop-asynchronous-e47e07b24d1c
https://prohannah.tistory.com/59
https://dkje.github.io/2020/09/20/AsyncAndEventLoop/
Reference
この問題について(JavaScript-同期と非同期), 我々は、より多くの情報をここで見つけました
https://velog.io/@jeveloper/TIL-JavaScript-동기비동기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(JavaScript-同期と非同期), 我々は、より多くの情報をここで見つけました https://velog.io/@jeveloper/TIL-JavaScript-동기비동기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol