[総括JavaScript 10]非同期コールバック(非同期コールバック関数)


Asynchronous Callback


JavaScriptは同期言語で、コードがエスケープされると、コードは順番に同期して実行されます.このとき、APIを使用して指定したコールバック関数を一定時間後に実行すると、時間差により非同期実行となる.

一般コード非同期の実行

<script>
	console.log('1');
    setTimeout(()=> console.log('2'), 1000); 
	console.log('3');
    
    // 결과 : '1'출력 > '3'출력 > (1초뒤) '2'출력
</script>

コールバック関数非同期実行

<script>
    function printWithDelay(print, timeout){
        setTimeout(print, timeout);
    }
    printWithDelay(()=> console.log('async callback'),2000);
    
    // 결과 : 2초 뒤에 'async callback' 출력 
</script>

Callback Hell


😵‍💫 カルバック地獄体験!

  • ユーザーはid、パスワードを入力します.
  • でコンテンツ登録サーバを入力します.
  • ログインユーザのIDを再取得します.
  • idでロール(ロール)を再要求して受信します.
  • は、ロールを使用してユーザのオブジェクト(name,role)を出力する.
  • <script>
    
    	// Class 생성하기 
        class UserStorage {
            loginUser(id, password, onSuccess, onError){
                setTimeout(()=> {
                    if(
                        (id === 'yura' && password === 'hey') ||
                        (id === 'Jenice' && password === 'hello')
                    ){
                        onSuccess(id);
                    } else {
                        onError(new Error('not found'));
                    }
                },2000);
            }
    
            getRoles(user, onSuccess, onError){
                setTimeout(()=> {
                    if(user === 'yura'){
                        onSuccess({name: 'yura', role: 'student'});
                    } else {
                        onError(new Error('no access'));
                    }
                },1000);
            }
        }
    
    
    	// 사용자 id, password 받아오고 role을 출력하는 Logic
        const userStorage = new UserStorage();
        const id = prompt('enter your id'); 
        const password = prompt('enter your password');
        userStorage.loginUser(
            id, 
            password, 
            user => {
                userStorage.getRoles(
                    user, 
                    userwithRole => {
                        alert(`Hello ${userwithRole.name}, you have a ${userwithRole.role} role`);
                    },
                    error => {
                        console.log(error);
                    }
                );
            }, 
            error => {
                console.log(error)
            }
        );
        
    </script>
  • idとパスワードを順番に入力すると、以下の情報が表示されます~!
  • 📌 追加)Promiseで簡単に再包装!

    <script>
        class UserStorage {
            loginUser(id, password){
                  return new Promise((resolve, reject) => {
                      setTimeout(()=> {
                          if(
                              (id === 'yura' && password === 'hey') ||
                              (id === 'Jenice' && password === 'hello')
                          ){
                              resolve(id);
                          } else {
                              reject(new Error('not found'));
                          }
                      },2000);
                  });
            }
    
            getRoles(user){
                return new Promise((resolve, reject) => {
                    setTimeout(()=> {
                        if(user === 'yura'){
                            resolve({name: 'yura', role: 'student'});
                        } else {
                            reject(new Error('no access'));
                        }
                    },1000);
                });
            }
        }
    
        const userStorage = new UserStorage();
        const id = prompt('enter your id'); 
        const password = prompt('enter your password');
        userStorage
            .loginUser(id, password)
            .then(user => userStorage.getRoles)
            .then(user => alert(`Hello ${user.name}, you have a ${user.role} role`))
            .catch(console.log);
    </script>
    🌱 Dream Codingをまとめました.:)