Skip to content

Instantly share code, notes, and snippets.

@externvoid
Last active August 19, 2018 00:35
Show Gist options
  • Select an option

  • Save externvoid/ded0f8b774a7c5666287921492893299 to your computer and use it in GitHub Desktop.

Select an option

Save externvoid/ded0f8b774a7c5666287921492893299 to your computer and use it in GitHub Desktop.
なんとなくの理解から脱出、Promise

MDNのPromiseに対する説明

非同期処理の最終的な完了、失敗を表すオブジェクトです?

さっぱり解らん。

しかし、これなら解る。

非同期処理関数A()の戻値yield aを使って処理B(), 処理C()を行う場合、次のような処理となる。

A(function(a){
  B(a, function(b) {
    C(b, function(c) {
      done(c)
    })
  })
})

これが、Promiseを使うと

A().then(B).then(C).then(done);  // ABC

Promiseを使うとは?どういう事?

Promiseインスタンスの生成1

let myFirstPromise = new Promise((resolve, reject) => {
  setTimeout(function(){
    resolve("Success!"); // Yay! Everything went well!
  }, 250);
});
// Promiseのインスタンスの使い方
myFirstPromise.then((successMessage) => {
  // successMessage is whatever we passed in the resolve(...) function above.
  // It doesn't have to be a string, but if it is only a succeed message, it probably will be.
  console.log("Yay! " + successMessage);
});

Promiseインスタンスの生成2 引数付きのfs.readFile(file)関数(同期関数)を非同期関数へ変換

fs = require('fs');

function readFileAsync(file) {
  return new Promise(function(resolve, reject){
    fs.readFile(file, function(err, data){
      if (err) {
        reject(err); // errがあればrejectを呼び出す
        return;
      }

      resolve(data); // errがなければ成功とみなしresolveを呼び出す
    });
  });
}
// 非同期関数の使い方
   readFileAsync(module.filename)
  .then(function(data){ console.log(data.toString('utf8')); });

今更だけどPromise入門

async/await(ES7, ES2016)って何だ?▶️PromiseのSyntax Sugar

asynce function sample() { … }でsampleは非同期関数になる。{ … }内に非同期関数の呼び出しがあった場合、awaitを{ … }内に記述する事で、関数呼び出しが同期実行される様になる。

うぅーん。何の役に立つのか?▶️非同期関数内に、更に非同期関数の呼出が有った時(連続した非同期処理)、その非同期関数は、同期実行して欲しい。

async/await 入門

連続した非同期処理なのに、awaitが無いとどうなる?▶️期待した動作はしない

awaitの記述は、連続した非同期処理の記述に必須。

誤解を避けるための確認事項

  1. 同期処理を非同期処理に変換してくれる、魔法ではない。
  2. あくまで、非同期処理の書き方を変換するための仕組みがPromiseである。callback hellをmethod chainへ変換できる。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment