###前提・実現したいこと
お世話になります。
Line Messaging APIでWebページにLineアプリ内の画像やテキストデータと同じものを写すようにするのに試行錯誤しています。
Lineアプリのようにメッセージや画像を送信した順に表示される様にfor文の中で
IDを元に非同期で画像データを取得しています。
現在、データベースにLineで送信したテキストや画像データを取得できるIDが入っています。
###該当のソースコード
js
1const imgObject = []; 2//contentに画像取得IDが格納されている 3for (let i in content) { 4 //事前にIDが空の場合には__LINE_TOKEN__文字列が入れてある。 5 //IDが格納されている場合にはバイナリデータを取得。 6 if (String(content[i].object).indexOf("__LINE_TOKEN__") !== 0) { 7 //APIヘッダー 8 var send_options = { 9 host: 'api.line.me', 10 path: '/v2/bot/message/' + content[i].object + '/content', 11 headers: { 12 "Content-type": "application/json; charset=UTF-8", 13 "Authorization": " Bearer {" + Token + "}" 14 }, 15 method: 'GET' 16 }; 17 18 //取得したバイナリデータをdata配列に格納 19 var req = https.request(send_options, function (res) { 20 var data = []; 21 //データを連続的に格納。 22 res.on('data', function (chunk) { 23 data.push(new Buffer(chunk)); 24 }).on('error', function (err) { 25 console.log(err); 26 }).on('end', function () { 27 //データが細切れになっているので連結。 28 var result = Buffer.concat(data); 29 imgObject.unshift(result); 30 } 31 }); 32 }); 33 req.end(); 34 } else{ 35 //IDが空の場合には再び__LINE_TOKEN__文字列を入れる。 36 imgObject.unshift('__LINE_TOKEN__'); 37 } 38 }
###出力
js
1[ 2'__LINE_TOKEN__,', 3'', 4'__LINE_TOKEN__,', 5'__LINE_TOKEN__,', 6'__LINE_TOKEN__,', 7'', 8'', 9'__LINE_TOKEN__,', 10'__LINE_TOKEN__,', 11'', 12'__LINE_TOKEN__,', 13'__LINE_TOKEN__,', 14'__LINE_TOKEN__,', 15'__LINE_TOKEN__,', 16'__LINE_TOKEN__,', 17'__LINE_TOKEN__,', 18'__LINE_TOKEN__,', 19'__LINE_TOKEN__,', 20'__LINE_TOKEN__,', 21'__LINE_TOKEN__,', 22'__LINE_TOKEN__,', 23'__LINE_TOKEN__,', 24'__LINE_TOKEN__,', 25'__LINE_TOKEN__,', 26'__LINE_TOKEN__,', 27'__LINE_TOKEN__,' 28]
問題点
バイナリデータをイベントハンドラを用いて取得しているのでfor文内で処理が後回しにされてしまいます。
js
1on('data'){ ... 2on('end'){ ...
配列に格納しないでコンソールにif条件文の結果を出力すると下記のようになります。
js
1'__LINE_TOKEN__,' 2'__LINE_TOKEN__,' 3'__LINE_TOKEN__,' 4'__LINE_TOKEN__,' 5'__LINE_TOKEN__,' 6'__LINE_TOKEN__,' 7'__LINE_TOKEN__,' 8'__LINE_TOKEN__,' 9'__LINE_TOKEN__,' 10'__LINE_TOKEN__,' 11'__LINE_TOKEN__,' 12'__LINE_TOKEN__,' 13'__LINE_TOKEN__,' 14'__LINE_TOKEN__,' 15'__LINE_TOKEN__,' 16'__LINE_TOKEN__,' 17'__LINE_TOKEN__,' 18 19<buffer ff 8d ...> 20<buffer ff 8d ...> 21<buffer ff 8d ...> 22<buffer ff 8d ...> 23<buffer ff 8d ...> 24<buffer ff 8d ...> 25<buffer ff 8d ...> 26<buffer ff 8d ...> 27
理想は取得した順でデータを配列に格納したいです、asyncモジュールなどを使ってみましたがイベントハンドラを同期的に処理することはできませんでした。
どうかお知恵をお貸しください、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/07 07:35