(Promise)(JS) 約束の仕方が間違っていた
自分の昨日まで.
Promiseは非同期処理を同期的に処理できるパターンなのだと思っていた.
それは正しくもあるが,完璧にそうではなかった,,,というより,同期的に処理するパターンをよく理解できていなかったのでハマった.
結果的に解決したので良かった.
まあ,その,要は,Promise本をさらっと読んだだけで,まだやったことなかったので理解が十分でなかったのが原因です.
こんな風に出力したかったです.
- file1.txtの内容
- file2.txtの内容
- Completed!!!
もともとの間違った出力はこうでした.
- Completed!!!
- file2.txtの内容
- file1.txtの内容
※ここでfile1.txtとfile2.txtの順は定かではないです.file1.txtはとても大きいサイズのファイルです.
同期的に処理するパターンのコード例
function startPromise() { Promise.resolve() .then(function (ret) { return promiseAjax('file1.txt'); }) .then(function (ret) { console.log(ret); return promiseAjax('file2.txt'); }) .then(function (ret) { console.log(ret); return; }) .catch(function (e) { console.log(err); return; }) .then(function (ret) { console.log('Completed!!!'); return; }); } function promiseAjax(fileName) { return new Promise(function (resolve) { var req = new XMLHttpRequest(); req.open('GET', '/' + fileName, true); req.onload = function () { if (req.status === 200) { resolve(req.responseText); } else { reject(new Error(req.statusText)); } }; req.onerror = function () { return reject(new Error(req.statusText)); }; req.send(); }); }
どこにハマっていたかというと,thenのなかで
- return promiseAjax('...');
とすべきところを,
- promiseAjax('...');
としていたところでした.
非同期処理は難しい?
いいえ, というより僕の頭のパラダイムシフトを進めなければなりません. 今後のプログラミングスタイルのスタンダードがそうなるからです.
追記:コールバックは難しい?
いいえ, やはり,僕の頭のパラダイムシフトを進めなければなりません. 今後のプログラミングスタイルのスタンダードがそうなるからです.