node.jsに関する記事一覧→ node.jsのまとめ
他の手段があるのも薄々知ってはいるんですが
今回は、あくまでもPromiseで書いたらどうなのかを考えている最中の、(仮)的な記事です
非同期的に実行しても問題なく
それらが全部終わったら○○しろという場面なら
Promise.all(<Promiseの配列>)等でやれば楽ちんですが
非同期処理が主体の仕様だと、いざ同期させたい時がかなり厄介ですよね
たとえばhttpでGETするという比較的時間の掛かる遅い処理の後に
ファイルを読み込みたい場合に、それらを単に並行で書いてしまうと
確実にファイル読み込みの方が先に発動して不具合が出るのは目に見えていますね
そんな時にどう書けば「思ったように実行順序を制御」した上で「可読性を確保できるか」を
考えている最中の記事になります
読み込むファイルはとりあえずutf-8で掛かれた、こんな感じのダミーデータです
ファイル名は './utf8_1.txt' としてます
utf-8 サンプルテキスト1
とりあえず意図した順番で実行の制御が出来ているのは、こんな感じ
同期的にやるんなら .thenでチェインしまくればいいというのはわかってはいるんですが
後から見た時になんかぱっと見ではわかりにくくなるような気がして
なんかメリハリみたいなのを付けれないかなぁと思ってるところです
#!/usr/local/bin/node const puts = console.log; // XMLHttpRequestのGETをPromise化 const get_html_pro = (url)=>{ return(new Promise((resolve, reject)=>{ puts('>>>> ' + url + ' のサイズを計測開始'); const xhr = new (require("xmlhttprequest").XMLHttpRequest); xhr.open('GET', url, true); xhr.onload = ()=>{ puts('>>>> ' + url + ' のサイズ計測完了') resolve(Buffer.byteLength(xhr.responseText)); }; xhr.send(); })); }; // fsのreadFileをPromise化 const readFile_pro = (filename, charset = 'utf-8')=>{ return(new Promise((resolve, reject)=>{ puts('>>>> ファイル読み込み開始'); require('fs').readFile( filename, charset, (err, txt)=>{ resolve(txt); } ); })); }; const url = 'https://www.youtube.com'; const html_pro = get_html_pro(url); const phase1 = html_pro.then((val)=>{ puts('>>>> ページサイズ: ' + val); }); const phase2 = phase1.then(()=>{ puts('>>>> ファイル読み込みフェイズ開始'); return( readFile_pro('./utf8_1.txt') .then((val)=>{ puts('------------------------------------'); puts(val) puts('------------------------------------'); puts('>>>> ファイル読み込みフェイズ完了'); }) ); }); phase2.then(()=>{ puts('>>>> 全行程終了'); });
結果としてはこんな感じの表示になります
>>>> https://www.youtube.com のサイズを計測開始 >>>> https://www.youtube.com のサイズ計測完了 >>>> ページサイズ: 490724 >>>> ファイル読み込みフェイズ開始 >>>> ファイル読み込み開始 ------------------------------------ utf-8 サンプルテキスト1 ------------------------------------ >>>> ファイル読み込みフェイズ完了 >>>> 全行程終了
ページサイズは実行するたびに変わる場合があります
まぁ、まだいろいろと試行錯誤中なのでまた考えがまとまったら正式な記事にするかも