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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

2210閲覧

chromeの拡張機能のstorageで保存した内容を取り出せない

退会済みユーザー

退会済みユーザー

総合スコア0

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2018/05/15 08:25

前提・実現したいこと

googlechromeの拡張機能でstorageを利用しています。
簡単に説明すると、

  1. 拡張機能のオプションで値(数列)を取得
  2. 値をストレージに保存
  3. 値をストレージから取り出して、グローバルのスコープにある配列に保存
  4. 変数に入った値をほかの関数で利用

このような流れのプログラムを実装したいと思っています。

発生している問題・エラーメッセージ

storage.syncのapiを使うと、値の保存はできるのですが、
それを取り出して、からの配列に保存することができません。

該当のソースコード

javascript

1// options.js 2$(function(){ 3 $("#clickSubmit").on("click", function(){ 4 // options.htmlのid="valueBox"となっているinputから入力値を取得します。 5 let pattern = $("#valueBox").val(); 6 chrome.storage.sync.set({pattern}, function(){ 7 $("#output").html("パターンを選択しました。"); 8 }); 9 }); 10}); 11 12// content.js(content_scripts) 13// オプション画面で03-1234-5678と入力した場合(主に電話番号を取りたい)。 14var patterns = []; // 取り出した要素を配列に入れていく。 15chrome.storage.sync.get(null, function(value){ 16 console.log(value); // => {pattern: "03-1234-5678"} 17 patterns.push(value.pattern); 18}); 19console.log(patterns); // コンソール上では [] が表示され、中に、0: "03-1234-5678"を確認できるが、以下のようになってしまう。 20console.log(patterns[0]); // => undefined

試したこと

トップレベルに定義したからの配列pattarnsをオブジェクト{}にして、pattarns["foo"]で呼び出してみたりしましたがよくわかりません。。。

思うに、chrome.storage.sync.get(......の中で、functionに渡した引数valueはしっかり返ってきているので、そのfunctionのスコープからvalueの中身を取り出せていないのが問題だと思っています。
しかし、トップレベルで配列patternsを定義しているのにもかかわらず、function内で配列に格納してから、外で呼び出せないのはなぜなのでしょうか。

javascript初心者です。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

chrome.storage.sync.get がコールバックを引数に取ることから分かる通り、非同期処理されているからでしょう。

追記

どうしてもコールバック処理したくないのであれば chorme.storage.sync.get をPromiseでラップした独自関数を作るのが良いと思います。
非同期処理に関しては JS の肝になるので一度しっかりと学習して理解を深めたほうが良いと思います。

js

1// Promise でラップ 2const getSyncStorage = (key = null) => new Promise(resolve => { 3 chrome.storage.sync.get(key, resolve); 4}); 5 6getSyncStorage() 7.then(({ pattern }) => { 8 console.log(pattern); // > "03-1234-5678" 9}); 10 11// おまけ: async/await パターン 12(async () => { 13 const { pattern } = await getSyncStorage(); 14 console.log(pattern); // > "03-1234-5678" 15})();

投稿2018/05/15 10:05

編集2018/05/16 01:02
og24715

総合スコア832

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

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

退会済みユーザー

退会済みユーザー

2018/05/18 09:37

ベストアンサーに選ばせていただきます。 promiseやasyncやawaitなど、まだ飲み込めていませんでしたので、この点の学習をさらに深めていきたいと思いました。 ご回答に時間を割いていただき、誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問