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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

Q&A

解決済

2回答

1143閲覧

async/awaitが正常に動作しない

yuki_90453

総合スコア326

JavaScript

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

0グッド

0クリップ

投稿2020/02/04 04:00

##概要
ユーザースクリプトとして、Chromeのデベロッパーツール上で実行する前提です。
コード内容は、Web上のTableからデータを取得し、API(GAS)を通してスプレッドシートで書き込む形になります。

##コード

async function testfunc(){ var tables = $('table.mt-table:eq(0) > tbody > tr') $(tables).each((i,v)=>{ var obj = JSON.parse($(v).attr('data-row-data')) var asin = obj.asin; var brand = 'hoge' var name = obj.title.slice(0,40) var postFrom = 'ユーザー1' var data = '{\"Name\":\"'+name+'\",\"Brand\":\"'+brand+'\",\"ASIN\":\"'+ asin + '\",\"From\":\"'+ postFrom + '\"}'; var url = 'https://script.google.com/macros/s/hogehoge/exec'; await fetch(url, { // Error method: 'POST', mode: "no-cors", headers: { 'Accept': 'application/json' }, body: data }).then((response) => { console.log(asin,'完了') }) }) } testfunc();

##抱えてる問題
eachループ内のfetchメソッドが非同期通信の為、全てのデータ送信前にコードが終了してしまい、全てのデータが送信されません。

そこで 下記のようにasyncとawaitを追加しましたが、「Uncaught SyntaxError: await is only valid in async function」をなってしまいます。

async function testfunc() await fetch

アドバイスお願い致します。

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

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

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

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

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

guest

回答2

0

.eachasync-awaitに対応していません。

  • 1つずつ実行したい場合:forループで回す
  • 並列に実行したい場合、Promise.all(Promiseの配列)とする

などの方法が考えられます。

投稿2020/02/04 04:10

maisumakun

総合スコア146018

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

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

yuki_90453

2020/02/04 04:16

なるほど!ありがとうございます!やってみます。
guest

0

ベストアンサー

jQueryに統一するか、逆に排除するかで改善されるかもしれません

投稿2020/02/04 04:07

yambejp

総合スコア116734

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

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

yambejp

2020/02/04 04:09

testfuncに指定したasyncはコールバックの中のawaitには 影響をあたえません
yuki_90453

2020/02/04 04:15

> jQueryに統一するか、逆に排除するかで改善されるかもしれません fetchの部分の事でしょうか?
yambejp

2020/02/04 04:19

eachがコールバックを呼んでますよね?
yuki_90453

2020/02/04 04:21

理解しました。教えてくれてありがとうございました。
yambejp

2020/02/04 04:38 編集

each的なものをfor構文にするサンプル (async ()=>{ console.log("start"); for(var i=1;i<=3;i++){ await new Promise(resolve=>{ setTimeout(x=>{ resolve(x); },1000,i); }).then(res=>{ console.log(res); }); } console.log("end"); })();
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問