javascript
1$(function () { 2 $("button").click(async function () { 3 var e, fh, fh_list, file, opts, reader; 4 console.log("step1"); 5 try { 6 console.log("step2"); 7 opts = { 8 types: [ 9 { 10 description: 'csv file', 11 accept: { 12 'text/csv': ['.csv'] 13 } 14 } 15 ] 16 }; 17 fh_list = (await window.showOpenFilePicker(opts)); 18 fh = fh_list[0]; 19 file = (await fh.getFile()); 20 reader = new FileReader(); 21 reader.readAsText(file, 'UTF-8'); 22 reader.onload = (event) => { 23 console.log("step3"); 24 console.log(event.target.result); 25 }; 26 } catch (error) { 27 e = error; 28 console.log(e); 29 } 30 console.log("end"); 31 }); 32});
ページ上に設置されているbuttonタグをクリックするとcsvファイル選択のダイアログが開き、そのあとに選択されたcsvの内容に基づいた処理を実行しようとしています。
しかし、上のコードでいう「step1」「step2」「step3」「end」の順番で実行されてほしいのに、awaitを入れているにも関わらず非同期処理になってしまい、「step1」「step2」「end」「step3」の順番になってしまいます。
どうすれば「end」のところを最後に実行させられるのでしょうか?
追記
javascript
1$(function () { 2 $("button").click(async function () { 3 var e, fh, fh_list, file, opts, reader; 4 console.log("step1"); 5 try { 6 console.log("step2"); 7 opts = { 8 types: [ 9 { 10 description: 'csv file', 11 accept: { 12 'text/csv': ['.csv'] 13 } 14 } 15 ] 16 }; 17 fh_list = (await window.showOpenFilePicker(opts)); 18 fh = fh_list[0]; 19 file = (await fh.getFile()); 20 reader = new FileReader(); 21 await new Promise((resolve, reject) => { 22 reader.addEventListener('load', resolve); 23 reader.addEventListener('error', reject); 24 reader.readAsText(file, 'UTF-8'); 25 reader.onload = (event) => { 26 console.log("step3"); 27 console.log(event.target.result); 28 }; 29 }); 30 } catch (error) { 31 e = error; 32 console.log(e); 33 } 34 console.log("end"); 35 }); 36});
promiseを入れても「step3」が最後に実行されてしまいます。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/04/10 23:43 編集
2023/04/10 23:55
2023/04/11 01:40