Upgrade to Pro — share decks privately, control downloads, hide ads and more …

N予備校プログラミングコース座談会 in 2021.10

Hakoeda
January 11, 2022

N予備校プログラミングコース座談会 in 2021.10

N予備校プログラミングコースでは、毎週行っているプログラミング授業のほかに毎月1回の頻度でプログラミングコース座談会という番組を行っています。

この番組では、授業中での回答が難しい質問や悩み、エンジニア就職に関する話など、授業ではメインで扱うことが難しい話題を取り扱っています。

Hakoeda

January 11, 2022
Tweet

More Decks by Hakoeda

Other Decks in Programming

Transcript

  1. • ドワンゴエンジニア11年目 • 主に社会人向けプログラミング研修の講師 やってます • たまに運営コメントにも登場します! • 宮崎県出身です •

    新しい授業を11月に始めます ◦ そちらもよろしくお願いします! 津野 貴大 -Tsuno Takahiro - 本 日 の ゲ ス ト
  2. "Hello!" プリミティブ型 オブジェクト それ以外 (仕組みや概念など) 12345 true null Promise Date

    String {} イベント 関数 プロパティ 変数 オブジェクトって何??
  3. "Hello!" オブジェクト JavaScriptの オブジェクト 12345 () => {} [] Promise

    Date String {} オブジェクトって何?? Object型 undefined null
  4. 基本的にオブジェクトはnewして使う const 変数名 = new オブジェクト名(初期値); const date = new

    Date(2021, 2, 11); const promise = new Promise(resolve => { resolve() }); const str = new String("Hello!"); オブジェクトには機能がある date.getYear(); // 2021 promise.then(() => console.log("Hello!")); str.toUpperCase(); // 'HELLO!' オブジェクトって何??
  5. プリミティブ型も実はオブジェクト 123 == new Number(123); // true "Hello" == new

    String("Hello"); // true true == new Boolean(true); // true "Hello".toUpperCase(); // 'HELLO' "Hello".substr(1,3); // 'ell' "Hello"[0]; // 'H' 文字列はString型の関数などが使える オブジェクトって何??
  6. オブジェクトって何?? JavaScriptのオブジェクト構文 const obj = { name: "Koeda Hajime", getFirstName:

    () => { return obj.name.split(" ")[0]; } } “データ”と”機能”を持つ集合体 という部分は同じ
  7. タスクA (5分) 非同期処理とは タスクB (5分) タスクD (5分) タスクE (5分) タスクF

    (5分) タスクG (5分) Aさん (メインスレッド) タスクC (30分) 同期的な処理 60分
  8. タスクA (5分) 非同期処理とは タスクB (5分) タスクD (5分) タスクE (5分) タスクF

    (5分) タスクG (5分) Aさん (メインスレッド) タスクC (30分) 同期的な処理 60分
  9. タスクA (5分) 非同期処理とは タスクB (5分) タスクD (5分) タスクE (5分) タスクF

    (5分) タスクG (5分) Aさん (メインスレッド) Bさん (別スレッド) タスクC (30分) タスクC (30分) 約30分 非同期的な処理
  10. タスクA (5分) 非同期処理とは タスクB (5分) タスクD (5分) タスクE (5分) タスクF

    (5分) タスクG (5分) Aさん (メインスレッド) タスクC (30分) 60分 同期的な処理 タスクDはタスクCの 処理に依存している
  11. タスクA (5分) 非同期処理とは タスクB (5分) タスクE (5分) タスクF (5分) タスクG

    (5分) Aさん (メインスレッド) Bさん (別スレッド) タスクC (30分) タスクC (30分) 35分 非同期的な処理 タスクD (5分) タスクD (5分)
  12. writeFileSync(“A”); writeFileSync(“B”); writeFile(“C”, () => { writeFileSync(“D”); // Cが終わったら実行 });

    writeFileSync(“E”); writeFileSync(“F”); writeFileSync(“G”); 非同期処理とは 非同期的な処理
  13. writeFileSync(“A”); writeFileSync(“B”); const p = new Promise(resolve => { //

    Cが終わったらresolveの関数を実行 writeFile(“C”, () => { resolve() }); }); p.then( () => { writeFile(“D”) } ); writeFileSync(“E”); writeFileSync(“F”); writeFileSync(“G”); 非同期処理とは Promise
  14. writeFileSync(“A”); writeFileSync(“B”); const p = new Promise(resolve => { //

    Cが終わったらresolveの関数を実行 writeFile(“C”, () => { resolve() }); }); p.then( () => { writeFile(“D”) } ); writeFileSync(“E”); writeFileSync(“F”); writeFileSync(“G”); 非同期処理とは thenで指定した関数は resolveに入る Promise
  15. writeFileSync(“A”); writeFileSync(“B”); writeFile(“C”, () => { writeFileSync(“D”); }); writeFileSync(“E”); writeFileSync(“F”);

    writeFileSync(“G”); 非同期処理とは 『Promiseオブジェクト』 として自由に扱える コールバック方式は、ここに 後続の処理を書き切らないと いけない。 書いた瞬間処理が始まる。
  16. writeFileSync(“A”); writeFileSync(“B”); const p = new Promise(resolve => { writeFile(“C”,

    () => { resolve() }); }); p.then( () => { writeFile(“D”) } ); writeFileSync(“E”); writeFileSync(“F”); writeFileSync(“G”); 非同期処理とは 『Promiseオブジェクト』 として自由に扱える p.thenはどこで書いても良い。 返り値としてpを渡すのもOK。 p.thenのタイミングで処理が始 まる。
  17. writeFile(“A”, () => { writeFile(“B”, () => { writeFile(“C”, ()

    => { writeFile(“D”, () => { writeFile(“E”); }); }); }); }); 非同期処理とは コールバック地獄にならない コールバック地獄 (どんどんネストが深くなる)
  18. new Promise ( r => writeFile(“A”, () => { r()

    }) .then( () => { return new Promise ( r => writeFile(“B”, () => { r() }) }) .then( () => { return new Promise ( r => writeFile(“C”, () => { r() }) }) .then( () => { return new Promise ( r => writeFile(“D”, () => { r() }) }) .then( () => { return new Promise ( r => writeFile(“E”, () => { r() }) }); 非同期処理とは コールバック地獄にならない Promise ならネストは深くならない
  19. function writeFilePromise(str) { return new Promise ( resolve => writeFile(str,

    () => { resolve() }); } writeFilePromise(“A”) .then(writeFilePromise(“B”)) .then(writeFilePromise(“C”)) .then(writeFilePromise(“D”)) .then(writeFilePromise(“E”)); 非同期処理とは コールバック地獄にならない Promise 生成部分を 関数化してスマートに
  20. タスクA (5分) 非同期処理とは タスクB (5分) タスクD (5分) タスクE (5分) タスクF

    (5分) タスクG (5分) Aさん (メインスレッド) Bさん (別スレッド) タスクC (30分) タスクC (30分) 60分(同期的な処理になるので効率は良くない) Async/Await タスクD (5分) 待ち
  21. function writeFilePromise(str) { return new Promise ( resolve => writeFile(str,

    () => { resolve() }); } writeFilePromise(“A”) .then(writeFilePromise(“B”)) .then(writeFilePromise(“C”)) .then(writeFilePromise(“D”)) .then(writeFilePromise(“E”)); 非同期処理とは Async/Await 構文が使える プロミスチェインを使った 非同期処理の同期化。 同じような記述が並んでいるが このままではFor文は使えない。
  22. function writeFilePromise(str) { return new Promise ( resolve => writeFile(str,

    () => { resolve() }); } async function writeAtoE() { await writeFilePromise(“A”); await writeFilePromise(“B”); await writeFilePromise(“C”); await writeFilePromise(“D”); await writeFilePromise(“E”); } writeAtoE(); // 関数を(非同期で)実行 非同期処理とは await を使う場合は関数化して async を付ける。 async/await を使えばプロミス チェインを解除できる。 Async/Await
  23. function writeFilePromise(str) { return new Promise ( resolve => writeFile(str,

    () => { resolve() }); } async function writeAtoE() { const chars = [“A”, “B”, “C”, “D”, “E”]; for (let i = 0; i < chars.length; i++) { await writeFilePromise(chars[i]); } } writeAtoE(); 非同期処理とは メソッドチェーンを解除できるとfor文 などが使える。 Async/Await
  24. function writeFilePromise(str) { return new Promise ( resolve => writeFile(str,

    () => { resolve(str); }); } async function writeAtoE() { const chars = [“A”, “B”, “C”, “D”, “E”]; for (let i = 0; i < chars.length; i++) { const result = await writeFilePromise(chars[i]); console.log(result + “の書き込みが完了しました”); } } writeAtoE(); 非同期処理とは 非同期処理の結果を返り値 として受け取ることもできる。 Async/Await