JavaScript同期/非同期

18518 ワード

Callback
hoisting
변수와 함수를 최상단으로 이동한 후 실행
Synchronous
以下のコードを実行し、1,2,3を順次出力します.
console.log("1");
console.log("2");
console.log("3");
Asynchronous
典型的な非同期関数setTimeout
console.log("1");
setTimeout(() => {
  console.log("2");
}, 1000);
console.log("3");
1、3、2の順に出力します.
Synchronous Callback
function printImmediately(print) {
  print();
}

console.log("1");
setTimeout(() => {
  console.log("2");
}, 1000);
console.log("3");

printImmediately(() => {
  console.log("hello");
});

Asynchronous Callback
function printWithDelay(print, timeout) {
  setTimeout(print, timeout);
}

console.log("1");
setTimeout(() => {
  console.log("2");
}, 1000);
console.log("3");

printWithDelay(() => {
  console.log("async callback");
}, 2000);

Callback地獄体験
次のカテゴリがある場合は、ログインに成功すると、ログインIDのロールが出力されるプログラムを作成できます.
class UserStorage {
  loginUser(id, password, onSuccess, onError) {
    setTimeout(() => {
      if (id === "2je0" && password === "1234") {
        onSuccess(id);
      } else {
        onError(new Error("not Found"));
      }
    }, 2000);
  }

  getRoles(user, onSuccess, onError) {
    setTimeout(() => {
      if (user === "2je0") {
        onSuccess({ name: "2je0", role: "student" });
      } else {
        onError(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,
  (id) => {}, 	// 로그인이 성공했을 때
  (error) => {} // 로그인이 실패했을 때
);
userStorage.loginUser(
  id,
  password,
  (id) => {
    userStorage.getRoles(
      id,
      (data) => {},
      (error) => {}
    );
  },
  (error) => {}
);
userStorage.loginUser(
  id,
  password,
  (id) => {
    console.log(id + " login success");
    userStorage.getRoles(
      id,
      (data) => {
        console.log("name : " + data.name + ", role : " + data.role);
      },
      (error) => {
        console.log(error);
      }
    );
  },
  (error) => {
    console.log(error);
  }
);
問題点:可読性↓、非同期ロジックに非同期ロジックを追加します.