質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

2回答

2277閲覧

JavaScriptのPromise処理で値が帰ってこない

hososo

総合スコア34

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

1クリップ

投稿2020/07/18 20:25

質問を読んで頂きありがとうございます。

ユーザがファイルをアップロードし、それを加工して表示するというプログラムを作ろうとしています。
ファイルをアップロード→内容を加工という処理を同期的に行うためにPromiseを使いましたが、値が上手く帰ってきません。
下記がそのコードです。雰囲気が伝わるよう、なるべく省略しないようにしましたので長くなってしまいましたがお許しください。

js

1// 読み込み1 ユーザがアップロードしたファイル1を加工して返却する。 2function getMasterCSV() { 3 return new Promise((resolve, reject)=>{ 4 try { 5 let masters = []; 6 let fileInput = document.getElementById('openMasterCSV_btn'); 7 let fileReader = new FileReader(); 8 fileInput.onchange = () => { 9 let file = fileInput.files[0]; 10 fileReader.readAsText(file); 11 }; 12 fileReader.onload = () => { 13 let result = fileReader.result; 14 // (略)加工処理をしてmastersに代入 15 resolve(masters); 16 } 17 } catch (e) { 18 reject(e); 19 }; 20 }); 21}; 22 23// 読み込み2 ユーザがアップロードしたファイル2を加工して返却する。 24function getTransferCSV() { 25 return new Promise((resolve, reject)=>{ 26 try { 27 let transfers = []; 28 let fileInput = document.getElementById('openTransferCSV_btn'); 29 let fileReader = new FileReader(); 30 fileInput.onchange = () => { 31 let file = fileInput.files[0]; 32 fileReader.readAsText(file); 33 }; 34 fileReader.onload = () => { 35 let result = fileReader.result; 36 // (略)加工処理をしてtransfersに代入 37 resolve(transfers); 38 } 39 } catch (e) { 40 reject(e); 41 }; 42 }); 43}; 44 45async function main() { 46 // 読み込まれたデータを受け取る 47 let masters = await getMasterCSV(); 48 let transfers = await getTransferCSV(); 49 console.log(masters); // なにも表示されない(undefinedとかでもない) 50 console.log(transfers); // なにも表示されない(undefinedとかでもない) 51} 52 53main();

このようなコードです。main()console.logではなにもコンソールに表示されなかったので、awaitはちゃんと機能している模様です。しかしresolve()した内容が帰ってきません。getMasterSCV getTransferCSVでエラーがあるのかとも思い、tryを噛ませてみましたがなにも表示されませんでした。

色々調べてみたのですが解決できず質問しました。回答よろしくお願致します。また、このようなファイルを読み込む処理ではそもそもPromiseを利用すべきではない、等の意見でもありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2020/07/18 22:06

コードを見る限りmastersやtransfersを返しているように見えますが、 // (略)加工処理をしてmastersに代入 の部分で具体的に何をしているのか不明のため、空文字列でも代入しているのかと思ってしまいます。まずは、Promiseの動作の確認のために、 masters.push("abc"); とか適当に書いた場合でも値は返ってこないか確認してみてください。
maisumakun

2020/07/18 23:24

2つのファイル入力フォームでファイルの選択は行いましたか?
AkitoshiManabe

2020/07/19 03:06

ご質問の内容は「ブラウザでは処理できない」という回答も有効です。 理由:「(アップロード直後の)サーバー側で処理すべき事例」と受け取れるため > ユーザがファイルをアップロードし、それを加工して表示する > ファイルをアップロード→内容を加工という処理 ブラウザ側での処理を実装するなら「(アップロード直前の)プレビュー時点で加工処理して表示」であり、「ファイル選択→プレビュー&加工→アップロードという処理」ではないでしょうか?
hososo

2020/07/19 05:17

自己解決という形になりましたが、大変助かりました。皆さんありがとうございます! >> raccyさん 「Promiseの動作の確認のために、masters.push("abc");とか適当に書いた場合でも値は返ってこないか確認してみてください。」のアドバイスが大変役に立ちました。デバック部分を分離することにより原因解明がはかどりました。ありがとうございます! >> maisumakunさん はい。入力フォームで選択を行いました。 >> AkitoshiManabeさん 混乱させて申し訳ございません。自己解決の欄に詳しく記述しましたが、提示したコードはフロント側のコードです。
guest

回答2

0

自己解決

まず最初に、私のあやふやな質問文で提示したコードがフロントの処理なのかサーバーの処理なのかで混乱させてしまったことをお詫びします。私が提示したコードはフロントで、ユーザがブラウザにアップロードした(この場合はアップロードとはいわないのかもしれません)csvファイルを、ブラウザに表示するという内容です。

解決に至った理由ですが、これは提示したコードには含まれていない

js

1let dataRecode = new Vue({ 2 el: '#dataRecode', 3 data: { 4 items: {}, 5 } 6})

の部分を削除することで解決しました。いくつかの回答を元に色々と試していくとこれはPromiseの問題ではなくファイルのアップロード処理に問題があるとわかり、そこに焦点を絞っていくと該当のVue.jsのコードを削除すると上手くということがわかりました。理由は不明です。

自己解決という形ですが、この結論に至るまでに回答に助けられた場面も多々ありましたので、お礼申し上げます。ありがとうございました!

投稿2020/07/19 05:17

hososo

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/07/19 05:29

ファイルのアップロードでファイルリーダーを使うのはあまり意味がないです アップロードせずにサムネイルを作ったりするときにご利用ください ファイルをFormDataでfetchするほうが効率的なので、時間ができたら よくよく検討してみてください
hososo

2020/07/19 05:48

知りませんでした。試してみようと思います。アドバイスありがとうござます!
guest

0

  • myfile.html

javascript

1<script> 2window.addEventListener('DOMContentLoaded',()=>{ 3 document.querySelector('#myfile').addEventListener('change', async e=>{ 4 const body=new FormData(); 5 body.append(e.target.name,e.target.files[0]); 6 const method="post"; 7 const v=await fetch("myfile.php",{body,method}).then(res=>res.text()); 8 document.querySelector('#view').textContent=v; 9 }); 10}); 11</script> 12<input type="file" name="myfile" id="myfile"> 13<div id="view"></div>
  • myfile.php

PHP

1<?PHP 2if(isset($_FILES["myfile"])){ 3 $fp=fopen($_FILES["myfile"]["tmp_name"],"r"); 4 $content=""; 5 while(!feof($fp)){ 6 $content.=fread($fp,10); 7 } 8 fclose($fp); 9 print "start\n".$content."\nend"; 10}

投稿2020/07/19 02:54

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問