본문 바로가기
언어 정리/JavaScript

[JavaScript] JS_expert_syntax

by 알 수 없는 사용자 2024. 9. 2.

https://ko.javascript.info/

 

모던 JavaScript 튜토리얼

 

ko.javascript.info

 

 

 


주요 내용(개인적임)

// /**
//  * ‘콜백 기반(callback-based)’ 비동기 프로그래밍이라고 하는데
//  * loadScript 함수가 끝나는 순서대로 동작 하게 된다.
//  */
// 순차적으로 종료
loadScript('/my/script.js', function (script) {
    newFunction();
    loadScript('/my/script2.js', function (script) {
        newFunction();
        loadScript('/my/script3.js', function (script) {
            newFunction();
            // 세 스크립트 로딩이 끝난 후 실행됨
        });
    })
});



new Promise((resolve, reject) => {
    throw new Error("에러 발생!");
})
    .then((result) => console.log("Promise Task Code ..."))
    .catch(err => alert(err)) // <-- .catch에서 에러 객체를 다룰 수 있음
    .finally(() => alert("프라미스가 준비되었습니다."));



/**
 * 프라미스 체이닝
 * .then .catch .finally 를 연속적으로 쓰며
 * 여러 동작을 하나의 체인처럼 엮어주는 방법
 * return 하거나 Promise 객체를 하나 더 만들어서 resolve 로 줘도 된다.
 */
 // 화살표 함수 활용
new Promise(function (resolve, reject) {
    setTimeout(() => resolve(1), 1000);
}) // (*)
    .then((a) => {
        alert(a); // 1
        let b = a * 2;
        return b;
    }).then((result) => {
        alert(result); // 2
        return new Promise((resolve, reject) => setTimeout(() => resolve(result * 2), 1000));
    }).then(function (result) {
        alert(result); // 4
        return result * 2;
    }).then((result) => result * 2  // 8 alert 생략
    ).then(alert) // 16
 
 
 
 
// JS 파일 한번에 불러오기
// 화살표 함수 활용
loadScript("my/script.js")
    .then(srcPath => {
        newFunction(); // "my/script.js" 파일에만 있는 함수
        return loadScript("my/script2.js")
    }).then(srcPath => loadScript("my/script3.js"))
    .then(srcPath => {
        // 스크립트를 정상적으로 불러왔기 때문에 스크립트 내의 함수를 호출할 수 있습니다.
        one();
        two();
        three();
    });
 
 
 
 
 
 // fetch 함수 활용
// 화살표 함수 활용 + 코드클린
function loadJson(url) {
    return fetch(url) // 해당 URL 경로로 fetch 를 실행 시키면 해당 경로에 있는 json 파일을 Text로 불러옴
        .then(response => response.json());
}

function loadGithubUser(name) {
    return fetch(`https://api.github.com/users/${name}`)
        .then(response => response.json());
}

function showAvatar(githubUser) {
    return new Promise(function (resolve, reject) {
        let img = document.createElement('img');
        img.src = githubUser.avatar_url;
        img.className = "promise-avatar-example";
        document.body.append(img);

        setTimeout(() => {
            img.remove();
            resolve(githubUser);
        }, 3000);
    });
}

// 함수를 이용하여 다시 동일 작업 수행
loadJson('/article/user.json')
    .then(user => loadGithubUser(user.name))
    .then(showAvatar)
    .then(githubUser => alert(`Finished showing ${githubUser.name}`));
 
 
 
 
 
 // Promise 의 에러핸들링
// 실행 순서: catch -> catch
new Promise((resolve, reject) => {

    throw new Error("에러 발생!");

}).catch(function (error) { // (*)

    if (error instanceof URIError) {
        /* 여기는 실행되지 않습니다. */
        alert("URI Error 발생 : ");// 에러 처리
    } else {
        alert("처리할 수 없는 에러");

        throw error; // 에러 다시 던지기
    }
}).then(function () {
    /* 여기는 실행되지 않습니다. */
    rightUri = prompt("URI가 틀렸습니다. 다시 입력해주세요");
    // rightUri 로 다시 시도 하는 코드 입력!
}).catch(error => { // (**)
    alert(`알 수 없는 에러가 발생함: ${error}`);
    // 반환값이 없음 => 실행이 계속됨
});
 
 
 
/**
 * async와 await
 * async - await 과 Promise 혼용 가능 ( python 에서 future 와 couroutine 관계를 비슷함 )
 */
async function f1() {
    return 1;
}
f1().then(alert); // 1
f1().then((result) => alert(result)); // 1  동일한거. JS 문법상 (result) 생략 가능한것.


async function f() {
    return Promise.resolve(1);
}
f().then(alert); // 1
f().then((result) => alert(result)); // 1  동일한거. JS 문법상 (result) 생략 가능한것.
alert(promiseResolve);


async function f() {

    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve("완료!"), 1000)
    });

    let result = await promise; // 프라미스가 이행될 때까지 기다림 (*)

    alert(result); // "완료!"
}

f();



 
// /**
//  * Promise.all( [] ) 
//  * [] 배열안에 있는 Promise 객체들을 병렬 실행 합니다.
//  * 여러 개의 프라미스를 동시에 실행시키고 모든 프라미스가 준비될 때까지 기다린다고 해봅시다.
//  * 복수의 URL에 동시에 요청을 보내고, 다운로드가 모두 완료된 후에 콘텐츠를 처리할 때 이런 상황이 발생합니다.
//  * 
//  * promise.race( [] )
//  * [] 배열 안에 있는 Task 중 먼저 끝난 것만 반환하고 넘어간다.
//  * 다른 Task 가 멈추진 않음, 할일 마저하고 쓸쓸히 혼자 퇴장한다.
//  * 
//  */
// async와 await : 병렬 실행하기
function delay(msg) {
    console.log(msg);
    return new Promise(resolve => setTimeout(resolve, 1000));
}
async function getApple(params) {
    await delay("APPLE WAITING");
    await delay("APPLE WAITING");
    await delay("APPLE WAITING");
    return "APPLE"
}
async function getBanana(params) {
    await delay("BANANA WAITING");
    return "Banana"
}

//1. 병렬실행 async - await
async function getAllFruits() {
    const applePromise = getApple();
    const bananaPromise = getBanana();
    const apple = await applePromise;
    const banana = await bananaPromise;
    return `${apple} + ${banana}`
}
getAllFruits()
    .then((result) => alert(result));
// .then(console.log);

//2. 병렬실행 promise.all
function getAllFruitsByPromiseApi() {
    return Promise.all(
        [getApple(), getBanana()])
        .then((result) => { return result });
}
getAllFruitsByPromiseApi()
    .then((result) => {
        alert(result);
        alert(Object.prototype.toString.call(result));
        alert(result[0] + " and " + result[result.length - 1])
    })

//3. 먼저 완료된 Task 만 반환
function pickOnlyOne() {
    return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne()
    .then(alert)

 


index.html

b<!DOCTYPE HTML>
<html>

<body>

  <p>스크립트 전</p>

  <!-- <script>
    alert( 'Hello, world!' );
  </script> -->
  <!-- <script src="main.js"></script> -->
  <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
  <script src="https://www.naver.com"></script> -->
  <!-- <script async src="main.js"></script> -->
  <!-- <script defer src="main.js"></script>
  <script defer src="callback.js"></script> -->
  <script defer src="promise.js"></script>
  <p>스크립트 후asdasd</p>

</body>

</html>

 

index.html   ( 원그리기 )

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <style>
    .message-ball {
      font-size: 20px;
      line-height: 200px;
      text-align: center;
    }
    .circle {
      transition-property: width, height, margin-left, margin-top;
      transition-duration: 2s;
      position: fixed;
      transform: translateX(-50%) translateY(-50%);
      background-color: red;
      border-radius: 50%;
    }
  </style>
</head>

<body>

<button onclick="go()">여기를 클릭해 주세요.</button>

  <script>

  function go() {
    showCircle(150, 150, 100, div => {
      div.classList.add('message-ball');
      div.append("안녕하세요!");
    });
  }

  function showCircle(cx, cy, radius, callback) {
    let div = document.createElement('div');
    div.style.width = 0;
    div.style.height = 0;
    div.style.left = cx + 'px';
    div.style.top = cy + 'px';
    div.className = 'circle';
    document.body.append(div);

    setTimeout(() => {
      div.style.width = radius * 2 + 'px';
      div.style.height = radius * 2 + 'px';

      div.addEventListener('transitionend', function handler() {
        div.removeEventListener('transitionend', handler);
        callback(div);
      });
    }, 0);
  }
  </script>


</body>
</html>

callback.js

 

'use strict';

// function loadScript(src) {
//     // <script> 태그를 만들고 페이지에 태그를 추가합니다.
//     // 태그가 페이지에 추가되면 src에 있는 스크립트를 로딩하고 실행합니다.
//     let script = document.createElement('script');
//     script.src = src;
//     document.head.append(script);
// }

// loadScript('/my/script.js'); // script.js엔 "function newFunction() {…}"이 있습니다.
// 비동기 호출 방식이다.

// newFunction();   // 함수가 존재하지 않는다는 에러가 발생합니다!
// loadScript('/my/script.js'); 함수가 로딩되기전에 불러와져서 그렇다.


function loadScript(src, callback) {
    let script = document.createElement('script');
    script.src = src;

    script.onload = () => callback(null, script);
    script.onerror = () => callback(new Error(`${src}를 불러오는 도중에 에러가 발생했습니다.`));

    document.head.append(script);
}


// /**
//  * ‘콜백 기반(callback-based)’ 비동기 프로그래밍이라고 하는데
//  * loadScript 함수가 끝나는 순서대로 동작 하게 된다.
//  */
// loadScript('/my/script.js', function () {
//     // 콜백 함수는 스크립트 로드가 끝나면 실행됩니다.
//     newFunction(); // 이제 함수 호출이 제대로 동작합니다.
// });

// loadScript('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js', script => {
//     alert(`${script.src}가 로드되었습니다.`);
//     alert(_); // 스크립트에 정의된 함수
// });

// loadScript('/my/script.js', function (script) {
//     alert(`${script.src}을 로딩했습니다. 이젠, 다음 스크립트를 로딩합시다.`);
//     loadScript('/my/script2.js', function (script) {
//         alert(`두 번째 스크립트를 성공적으로 로딩했습니다.`);
//     });
// });



// // 순차적으로 종료
// loadScript('/my/script.js', function (script) {
//     newFunction();
//     loadScript('/my/script2.js', function (script) {
//         newFunction();
//         loadScript('/my/script3.js', function (script) {
//             newFunction();
//             // 세 스크립트 로딩이 끝난 후 실행됨
//         });
//     })
// });



// 에러 핸들링
// 이렇게 깊은 중첩 코드가 만들어내는 패턴은 소위 ‘콜백 지옥(callback hell)’ 혹은 '멸망의 피라미드(pyramid of doom)'라고 불립니다.
function handleError(e) {
    alert(`Error : ${e}`);
}
loadScript('/my/script.js', function (error, script) {
    if (error) {
        handleError(error);
    } else {
        newFunction();
        loadScript('/my/script2.js', function (error, script) {
            if (error) {
                handleError(error);
            } else {
                newFunction();
                loadScript('/my/script33333333333.js', function (error, script) {
                    if (error) {
                        handleError(error);
                    } else {
                        newFunction();
                        // 모든 스크립트가 로딩된 후, 실행 흐름이 이어집니다. (*)
                    }
                });
            }
        })
    }
});





loadScript('/my/script.js', step1);

function step1(error, script) {
    if (error) {
        handleError(error);
    } else {
        newFunction();
        loadScript('/my/script2.js', step2);
    }
}

function step2(error, script) {
    if (error) {
        handleError(error);
    } else {
        newFunction();
        loadScript('/my/script3.js', step3);
    }
}

function step3(error, script) {
    if (error) {
        handleError(error);
    } else {
        newFunction();
        // 모든 스크립트가 로딩되면 다른 동작을 수행합니다. (*)
        alert("종료");
    }
};

 

 

promise.js

'use strict';

// /**
//  * Promise(프라미스) 정리
//  * executor는 resolve나 reject 중 하나를 반드시 호출해야 합니다. 이때 변경된 상태는 더 이상 변하지 않습니다.
//  */
// let promiseSuccess = new Promise(function (resolve, reject) {
//     // 프라미스가 만들어지면 executor 함수는 자동으로 실행됩니다.

//     // 1초 뒤에 일이 성공적으로 끝났다는 신호가 전달되면서 result는 '완료'가 됩니다.
//     setTimeout(() => resolve("완료"), 1000);
// });


// let promiseFail = new Promise(function (resolve, reject) {
//     // 1초 뒤에 에러와 함께 실행이 종료되었다는 신호를 보냅니다.
//     setTimeout(() => reject(new Error("에러 발생!")), 1000);
// });


// promiseSuccess.then(
//     result => alert(result), // 1초 후 "완료!"를 출력
//     error => alert(error) // 실행되지 않음
// );

// promiseFail.then(
//     result => alert(result), // 실행되지 않음
//     error => alert(error)    // 1초 후 "Error: 에러 발생!"를 출력
// );

// promiseSuccess.then(alert); // 1초 뒤 "완료!" 출력

// // .catch(f)는 promise.then(null, f)과 동일하게 작동합니다
// promiseFail.catch(alert); // 1초 뒤 "Error: 에러 발생!" 출력

// new Promise((resolve, reject) => {
//     setTimeout(() => resolve("결과"), 2000)
// })
//     .finally(() => alert("프라미스가 준비되었습니다."))
//     .then(result => alert(result)); // <-- .then에서 result를 다룰 수 있음


// new Promise((resolve, reject) => {
//     throw new Error("에러 발생!");
// })
//     .then((result) => console.log("Promise Task Code ..."))
//     .catch(err => alert(err)) // <-- .catch에서 에러 객체를 다룰 수 있음
//     .finally(() => alert("프라미스가 준비되었습니다."));



// /**
//  * 콜백 기반 프로그래밍 vs 프라미스 프로그래밍
//  */
// function loadScriptByCallbackBase(src, callback) {
//     let script = document.createElement('script');
//     script.src = src;

//     script.onload = () => callback(null, script);
//     script.onerror = () => callback(new Error(`${src}를 불러오는 도중에 에러가 발생함`));

//     document.head.append(script);
// }



function loadScript(src) {
    return new Promise(function (resolve, reject) {
        let script = document.createElement('script');
        script.src = src;

        script.onload = () => resolve(script);
        script.onerror = () => reject(new Error(`${src}를 불러오는 도중에 에러가 발생함`));

        document.head.append(script);
    });
}



// let promise = loadScript("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js");

// promise.then(
//     script => alert(`${script.src}을 불러왔습니다!`),
//     error => alert(`Error: ${error.message}`)
// );

// promise.then(script => alert('또다른 핸들러...'));



// /**
//  * 프라미스 체이닝
//  * .then .catch .finally 를 연속적으로 쓰며
//  * 여러 동작을 하나의 체인처럼 엮어주는 방법
//  * return 하거나 Promise 객체를 하나 더 만들어서 resolve 로 줘도 된다.
//  */
// new Promise(function (resolve, reject) {
//     setTimeout(() => resolve(1), 1000); // (*)
// }).then(function (a) { // (**)

//     alert(a); // 1
//     let b = a * 2;
//     return b;

// }).then(function (result) { // (***)
//     alert(result); // 2
//     return new Promise((resolve, reject) => { // (*)
//         setTimeout(() => resolve(result * 2), 1000);
//     });

// }).then(function (result) {
//     alert(result); // 4
//     return result * 2;
// });


// // 화살표 함수 활용
// new Promise(function (resolve, reject) {
//     setTimeout(() => resolve(1), 1000);
// }) // (*)
//     .then((a) => {
//         alert(a); // 1
//         let b = a * 2;
//         return b;
//     }).then((result) => {
//         alert(result); // 2
//         return new Promise((resolve, reject) => setTimeout(() => resolve(result * 2), 1000));
//     }).then(function (result) {
//         alert(result); // 4
//         return result * 2;
//     }).then((result) => result * 2  // 8 alert 생략
//     ).then(alert) // 16


// // JS 파일 한번에 불러오기
// // let checkPromiseStatus = loadScript("my/script.js")
// loadScript("my/script.js")
//     .then(function (script) {
//         // 불러온 스크립트 안에 정의된 함수를 호출해
//         // 실제로 스크립트들이 정상적으로 로드되었는지 확인합니다.
//         newFunction();
//         return loadScript("my/script2.js");
//     })
//     .then(function (script) {
//         newFunction();
//         // 불러온 스크립트 안에 정의된 함수를 호출해
//         // 실제로 스크립트들이 정상적으로 로드되었는지 확인합니다.
//         return loadScript("my/script3.js");
//     })
//     .then(function (script) {
//         // 불러온 스크립트 안에 정의된 함수를 호출해
//         // 실제로 스크립트들이 정상적으로 로드되었는지 확인합니다.
//         newFunction();
//     });
// console.log(checkPromiseStatus)


// // 화살표 함수 활용
// loadScript("my/script.js")
//     .then(srcPath => {
//         newFunction(); // "my/script.js" 파일에만 있는 함수
//         return loadScript("my/script2.js")
//     }).then(srcPath => loadScript("my/script3.js"))
//     .then(srcPath => {
//         // 스크립트를 정상적으로 불러왔기 때문에 스크립트 내의 함수를 호출할 수 있습니다.
//         one();
//         two();
//         three();
//     });


// // fetch 함수 활용
// // '/article/user.json' 이 경로로 fetch 를 실행 시키면 해당 경로에 있는 json 파일을 Text로 불러옴
// fetch('/article/user.json')
//     // 응답받은 내용을 json으로 불러옵니다.
//     .then(response => {
//         typeof (response);
//         console.log(response);
//         console.log('-------------------');
//         // console.log(Object.getOwnPropertyNames(response));
//         console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(response)));
//         // -- python 에서 print(response.__dir__()) 이랑 비슷한데 잘 안되네 ㅅㅂ
//         // console.log(response.status())
//         return response.json();
//     })
//     // GitHub에 요청을 보냅니다.
//     .then(user => fetch(`https://api.github.com/users/${user.name}`))
//     // 응답받은 내용을 json 형태로 불러옵니다.
//     .then(response => response.json())
//     // 3초간 아바타 이미지(githubUser.avatar_url)를 보여줍니다.
//     .then(githubUser => {
//         let img = document.createElement('img');
//         img.src = githubUser.avatar_url;
//         img.className = "promise-avatar-example";
//         document.body.append(img);

//         setTimeout(() => img.remove(), 3000); // (*)
//     });


// // 화살표 함수 활용 + 코드클린
// function loadJson(url) {
//     return fetch(url) // 해당 URL 경로로 fetch 를 실행 시키면 해당 경로에 있는 json 파일을 Text로 불러옴
//         .then(response => response.json());
// }

// function loadGithubUser(name) {
//     return fetch(`https://api.github.com/users/${name}`)
//         .then(response => response.json());
// }

// function showAvatar(githubUser) {
//     return new Promise(function (resolve, reject) {
//         let img = document.createElement('img');
//         img.src = githubUser.avatar_url;
//         img.className = "promise-avatar-example";
//         document.body.append(img);

//         setTimeout(() => {
//             img.remove();
//             resolve(githubUser);
//         }, 3000);
//     });
// }

// // 함수를 이용하여 다시 동일 작업 수행
// loadJson('/article/user.json')
//     .then(user => loadGithubUser(user.name))
//     .then(showAvatar)
//     .then(githubUser => alert(`Finished showing ${githubUser.name}`));



// // Promise 의 에러핸들링
// fetch('https://no-such-server.blabla') // 거부
//     .then(response => response.json())
//     .catch(err => alert(err)) // TypeError: failed to fetch (출력되는 내용은 다를 수 있음)



// fetch('/article/user.json')
//     .then(response => response.json())
//     .then(user => fetch(`https://api.github.com/users/${user.name}`))
//     .then(response => response.json())
//     .then(githubUser => new Promise((resolve, reject) => {
//         let img = document.createElement('img');
//         img.src = githubUser.avatar_url;
//         img.className = "promise-avatar-example";
//         document.body.append(img);

//         setTimeout(() => {
//             img.remove();
//             resolve(githubUser);
//         }, 3000);
//     }))
//     .catch(error => alert(error.message));


// // 실행 순서: catch -> catch
// new Promise((resolve, reject) => {

//     throw new Error("에러 발생!");

// }).catch(function (error) { // (*)

//     if (error instanceof URIError) {
//         /* 여기는 실행되지 않습니다. */
//         alert("URI Error 발생 : ");// 에러 처리
//     } else {
//         alert("처리할 수 없는 에러");

//         throw error; // 에러 다시 던지기
//     }
// }).then(function () {
//     /* 여기는 실행되지 않습니다. */
//     rightUri = prompt("URI가 틀렸습니다. 다시 입력해주세요");
//     // rightUri 로 다시 시도 하는 코드 입력!
// }).catch(error => { // (**)
//     alert(`알 수 없는 에러가 발생함: ${error}`);
//     // 반환값이 없음 => 실행이 계속됨
// });



// new Promise(function (resolve, reject) {
//     setTimeout(() => {
//         alert(1111111111111111111);
//         throw new Error("에러 발생!");
//     }, 1000);
// }).then(() => alert(22222222222)
// ).catch(alert);



// /**
//  * Promise.all( [] ) 
//  * [] 배열안에 있는 Promise 객체들을 병렬 실행 합니다.
//  * 여러 개의 프라미스를 동시에 실행시키고 모든 프라미스가 준비될 때까지 기다린다고 해봅시다.
//  * 복수의 URL에 동시에 요청을 보내고, 다운로드가 모두 완료된 후에 콘텐츠를 처리할 때 이런 상황이 발생합니다.
//  * 
//  */
// Promise.all([
//     new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
//     new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
//     new Promise(resolve => setTimeout(() => resolve(3), 1000))  // 3
// ]).then(alert); // 프라미스 전체가 처리되면 1, 2, 3이 반환됩니다. 각 프라미스는 배열을 구성하는 요소가 됩니다.


// Promise.all([
//     new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
//     new Promise((resolve, reject) => setTimeout(() => reject(new Error("에러 발생!")), 2000)),
//     new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
// ]).catch(alert); // Error: 에러 발생!


// Promise.all([
//     new Promise((resolve, reject) => {
//         setTimeout(() => resolve(1), 1000)
//     }),
//     2,
//     3
// ]).then(alert); // 1, 2, 3


// // Callback to Promise (( 프라미스가 아닌 코드를 프라미스처럼 ))
// function loadScript(src, callback) {
//     let script = document.createElement('script');
//     script.src = src;

//     script.onload = () => callback(null, script);
//     script.onerror = () => callback(new Error(`${src}를 불러오는 도중에 에러가 발생함`));

//     document.head.append(script);
// }

// // 사용법:
// // loadScript('path/script.js', (err, script) => {...})

// let loadScriptPromise = function (src) {
//     return new Promise((resolve, reject) => {
//         loadScript(src, (err, script) => {  // <- 콜백함수
//             if (err) reject(err)
//             else resolve(script);
//         });
//     })
// }

// // 사용법:
// // loadScriptPromise('path/script.js').then(...)


// /**
//  * async와 await
//  */
// async function f1() {
//     return 1;
// }
// f1().then(alert); // 1
// f1().then((result) => alert(result)); // 1  동일한거. JS 문법상 (result) 생략 가능한것.


// async function f() {
//     return Promise.resolve(1);
// }
// f().then(alert); // 1
// f().then((result) => alert(result)); // 1  동일한거. JS 문법상 (result) 생략 가능한것.
// alert(promiseResolve);


// async function f() {

//     let promise = new Promise((resolve, reject) => {
//         setTimeout(() => resolve("완료!"), 1000)
//     });

//     let result = await promise; // 프라미스가 이행될 때까지 기다림 (*)

//     alert(result); // "완료!"
// }

// f();




// async function showAvatar() {

//     // JSON 읽기
//     let response = await fetch('/article/user.json');
//     let user = await response.json();

//     // github 사용자 정보 읽기
//     let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
//     let githubUser = await githubResponse.json();

//     // 아바타 보여주기
//     let img = document.createElement('img');
//     console.log(githubUser.avatar_url);
//     img.src = githubUser.avatar_url;
//     img.className = "promise-avatar-example";
//     document.body.append(img);

//     // 3초 대기
//     await new Promise((resolve, reject) => setTimeout(resolve, 3000));

//     img.remove();

//     return githubUser;
// }

// showAvatar();

// class Waiter {
//     async wait() {
//         return await Promise.resolve(1);
//     }
// }

// new Waiter()
//     .wait()
//     .then(alert); // 1

// // 동일
// let waiter = new Waiter();
// waiter.wait()
//     .then((result) => alert(result));



// //  async와 await : 에러 핸들링 try - catch 쓰든가, .catch 써도된다
// async function f() {

//     try {
//         let response = await fetch('http://유효하지-않은-주소');
//     } catch (err) {
//         alert(err); // TypeError: failed to fetch
//     }
// }

// f();


// async function f() {

//     try {
//         let response = await fetch('http://유효하지-않은-주소');
//         let user = await response.json();
//     } catch (err) {
//         // fetch와 response.json에서 발행한 에러 모두를 여기서 잡습니다.
//         alert(err);
//     }
// }

// f();



// /**
//  * Promise.all( [] ) 
//  * [] 배열안에 있는 Promise 객체들을 병렬 실행 합니다.
//  * 여러 개의 프라미스를 동시에 실행시키고 모든 프라미스가 준비될 때까지 기다린다고 해봅시다.
//  * 복수의 URL에 동시에 요청을 보내고, 다운로드가 모두 완료된 후에 콘텐츠를 처리할 때 이런 상황이 발생합니다.
//  * 
//  * promise.race( [] )
//  * [] 배열 안에 있는 Task 중 먼저 끝난 것만 반환하고 넘어간다.
//  * 다른 Task 가 멈추진 않음, 할일 마저하고 쓸쓸히 혼자 퇴장한다.
//  * 
//  * async와 await : 병렬 실행하기
//  */
function delay(msg) {
    console.log(msg);
    return new Promise(resolve => setTimeout(resolve, 1000));
}
async function getApple(params) {
    await delay("APPLE WAITING");
    await delay("APPLE WAITING");
    await delay("APPLE WAITING");
    return "APPLE"
}
async function getBanana(params) {
    await delay("BANANA WAITING");
    return "Banana"
}

//1. 병렬실행 async - await
async function getAllFruits() {
    const applePromise = getApple();
    const bananaPromise = getBanana();
    const apple = await applePromise;
    const banana = await bananaPromise;
    return `${apple} + ${banana}`
}
getAllFruits()
    .then((result) => alert(result));
// .then(console.log);

//2. 병렬실행 promise.all
function getAllFruitsByPromiseApi() {
    return Promise.all(
        [getApple(), getBanana()])
        .then((result) => { return result });
}
getAllFruitsByPromiseApi()
    .then((result) => {
        alert(result);
        alert(Object.prototype.toString.call(result));
        alert(result[0] + " and " + result[result.length - 1])
    })

//3. 먼저 완료된 Task 만 반환
function pickOnlyOne() {
    return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne()
    .then(alert)

 

article/user.json

{
  "name": "Violet-Bora-Lee",
  "isAdmin": true
}

 

my/script.js

function newFunction(){
    alert("my/script.js Path 에 있는 함수");
}
function one(){
    alert("one");
}

 

my/script2.js

function newFunction(){
    alert("my/script2.js Path 에 있는 함수");
}
function two(){
    alert("two");
}

 

my/script3.js

function newFunction(){
    alert("my/script3.js Path 에 있는 함수");
}
function three(){
    alert("three");
}

댓글