#
ドキュメント

Document

自分のための備忘録です。

Promise/async・await

Ref

Promise サンプル

/*
 * Promiseはインスタンスを生成した時点で
 * コンストラクタへ渡したコールバックが実行される
 *
 * コメント数字は実行順序
 * promise.thenが3, 4より遅く(非同期に)実行される理由は下記のリンクを参照
 * https://azu.github.io/promises-book/#promise-is-always-async
 */
const promise = new Promise(resolve => {
  console.log('first.');        // ----- (1)
  resolve('done.');
});

console.log('something 1.');    // ----- (2)

/*
 * thenは非同期に実行
 */
promise.then((data) => {
  console.log(data)            // ----- (5)
});

console.log('something 2.')    // ----- (3)
console.log('something 3.')    // ----- (4)

// first.
// something 1.
// something 2.
// something 3.
// done.

then、catchメソッド例

/*
 * 奇数はエラー、偶数は成功
 */
const promise = new Promise((resolve, reject) => {
  randomValue = Math.ceil(Math.random() * 100);
  if (randomValue % 2 === 1) {
    return reject(randomValue);
  }
  resolve(randomValue);
});

/*
 * thenを設定した時点で評価しコールバック実行
 */
promise.then((value) => {
  console.log(`${value} is Success.`);
}).catch(() => {
  console.log(`${value} is Error.`);
});

Promiseの簡単なサンプル2

/*
 * Promiseの例
 * 直列処理で1秒間隔で2回日付を表示し最後にcompleteを出力
 */
function showFirstTime() {
  return new Promise(resolve => {
    window.setTimeout(
      function() {
        console.log("First Time: " + new Date().toString());
        resolve();
      },
      1000);
  });
}

function showSecondTime() {
  return new Promise(resolve => {
    window.setTimeout(
      function() {
        console.log("Second Time" + new Date().toString());
        resolve();
      },
      1000);
  });
}

// ここから実行
showFirstTime().then(showSecondTime).then(()=>{
  console.log('complete');
});
First Time: Sat Aug 19 2017 06:46:55 GMT+0900 (JST)
Second TimeSat Aug 19 2017 06:46:56 GMT+0900 (JST)
complete

Async/Await

/*
 * async/await
 * https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
 * TypeScriptではエラー バージョンの問題か
 */

function resolveAfter1Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 1000);
  });
}

async function add1(x) {
  var a = resolveAfter1Seconds(20);
  var b = resolveAfter1Seconds(30);
  return x + await a + await b;
}

add1(10).then(v => {
  console.log(v); // prints 60 after 1 seconds.
});

async function add2(x) {
  var a = await resolveAfter1Seconds(20);
  var b = await resolveAfter1Seconds(30);
  return x + a + b;
}

add2(20).then(v => {
  console.log(v); // prints 70 after 2 seconds.
});
/*
 * Async/Await
 * 直列処理で1秒間隔で2回日付を表示
 *
 * 別サンプルで下記も参照
 * https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
 */
function nowTime() {
  return new Promise(resolve => {
    window.setTimeout(
      function() {
        console.log("Time: " + new Date().toString());
        resolve();
      },
      1000);
  });
}

async function showTime() {
  await nowTime();
  await nowTime();
}

// ここから実行
showTime();

async/await

function createTimer() {
    return new Promise( (resolve, reject) => {
        setTimeout( () => resolve( 'aaa' ), 3000 )
    } );
}

async function sync() {
    const response = await createTimer();
    console.log(response);
    return 'bbb'
}

sync().then((value) => {
    console.log(value);
})

console.log('zzz');

// zzz
// aaa
// bbb
// ==UserScript==
// @name         Esa link replace
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://h-sawai.docbase.io/posts/*/edit
// @icon         https://www.google.com/s2/favicons?domain=docbase.io
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    let objectToString = Object.prototype.toString;

    const wait = (sec) => {
        return new Promise((resolve, reject) => {
            const intervalId = setInterval(()=> {
                const element = document.querySelector('.CodeMirror-codey');
                if (element !== null) {
                    clearInterval(intervalId);
                    resolve(element);
                }
            }, sec*1000);
      });
    };

    async function main() {
        try {
            const codearea = await wait(1);
            console.log(codearea.innerHTML);
        } catch (err) {
            console.error(err);
        }
    }
     main();
})();