1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

fetchメソッド内で他のメソッドを呼ぶと、 Chromeでは上手くいくのにSafariではうまくいかない問題

Posted at

困ったこと

fetchメソッド内で、他のメソッドを呼ぶと、
Chromeでは上手くいくのにSafariではうまくいかない。

言葉でつらつら書くよりコードを見ていただいた方が早いので、コードで示します。

        const word_area     = document.getElementById("word_area");
        const btn_to_submit = document.getElementById("btn_to_submit");
        const def_list      = [];
        const url           = "hogehoge";

        btn_to_submit.addEventListener("click", () => {
          console.log(eng_word);
          fetch(url)
          .then(response => {
            return response.json();
          })
          .then(data => {
            // jsonファイルで取得した特定の値をdef_listという配列に詰めていく。
            data[0].shortdef.map(def => {
              def_list.push(def);
            })
            // addMeaning()というメソッド呼び出し
            addMeaning();
          })
          .catch(error => {
            console.log('error');
          });
        })

        function addMeaning() {
            // 本当はここでdef_listという配列をいろいろいじってます。
            console.log(def_list);
        }

上でも書いたように、これだとchromeではうまくいきますが、Safariではうまくいきません。
うまくいかないというのは、addMening()を呼び出すと、
catchメソッドが呼ばれてしまうのです。(=fetchメソッド内でエラーが起きている)

詳しく見ていったところ、addMening()def_listをうまく参照できていない???

解決策

functionを使った関数ではなく、アロー関数にする!

        // ダメな例
        function addMeaning() {
            // 本当はここでdef_listという配列をいろいろいじってます。
            console.log(def_list);
        }
        // 良い例
        const addMeaning = () => {
            // 本当はここでdef_listという配列をいろいろいじってます。
            console.log(def_list);
        }
        // これでもいけました。
        const addMeaning = function(){
            // 本当はここでdef_listという配列をいろいろいじってます。
            console.log(def_list);
        }

まとめ

なんでかは分かりませんが、アロー関数を使うことでSafariでも動作するようになりました。
これ、どなたか理由が分かる方がいらっしゃいましたら、ご教授してくださると幸いです。

最後まで読んでくださり、ありがとうございました。
以上です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?