Можно ли “зашить” chrome.storage.sync. get/set в отдельные функции и возвращать из них результат?

243
20 января 2017, 09:24

Есть вопрос который давно меня мучает. Функции вроде chrome.storage.sync имеют какой-то механизм защиты что-ли или просто в области видимости дело, непонятно.

Пишу приложение, уже задавал вопросы по методу сохранения данных, но все же необходимо сократить код так что-бы функции типа chrome.storage.sync.get() или chrome.storage.sync.set() были зашиты в отдельные функции в примерно такой конструкции:

function get_option_storage(option_name) {
    var result = false;
    chrome.storage.sync.get( option_name, function(func_result) {
        result = func_result;
    });
    return result; 
}

и для установки

function set_option_storage(option_name, option_value) {
    var result = false;
    chrome.storage.sync.set( {option_name: option_value}, function() {
        result = true;
    });
    return result;
}

Пришел к этому из-за высокого количества запросов на сохранение и чтение данных из хранилища, поэтому хочу зашить в отдельные функции методы работы с хранилищем и вызывать уже свои, как это можно сделать и можно ли вообще?

Answer 1

Почти все методы chrome.*, имеющие коллбеки — асинхорнные. Соответственно, асинхорнные методы не возвращают какие-либо данные. Это не механизм защиты и даже не область видимости — это фича, которую завезли для увеличения скорости сценариев JavaScript.

О том, что такое асинхронные методы, я, как мне кажется, доступно объяснил в ответе на этот вопрос: Поиск элементов на странице и API VK. Если интересно, то почитайте.

Что можно сделать:

  1. Используйте Promises. Статьи по этой теме:

    • О Promises на Mozilla Developer Network
    • Хороший обучающий материал на эту тему на learn.javascript.ru
    • Обещания JavaScript - статья на Хабре
  2. Используйте готовое решение в виде полифилла от Mozilla: mozilla/webextension-polyfill. Он немного сыроват, но добавить поддержку Promises с ним довольно просто. Обратите внимание на то, что данный полифилл покрывает не все методы (некоторые непопулярные методы придется добавлять ручками), а также немного меняет API.

Но от кастомных функций вида get*, которые что-то возвращают через return, все же придется отказаться. Единственное, что могу посоветовать — перестраивайте структуру приложения или используйте коллбеки вместо return.

READ ALSO
Как в ReactJS организовать подключение компонента из другого файла?

Как в ReactJS организовать подключение компонента из другого файла?

Уважаемые знатоки React! Подскажите, как правильно организовать подключение и использование компонента, который хранится в отдельном файле?...

406
Чем заменить setAttribute в IE?

Чем заменить setAttribute в IE?

Работает везде кроме IE

262