Каков наилучший шаблон проектирования для асинхронной передачи сообщений в расширении Chrome? - PullRequest
1 голос
/ 13 февраля 2012

У меня есть фоновый скрипт, который отвечает за получение и установку данных в базу данных localStorage. Мои сценарии содержимого должны взаимодействовать с фоновым сценарием для отправки и получения данных.

Прямо сейчас я отправляю объект JSON в функцию, которая содержит команду и данные. Поэтому, если я пытаюсь добавить объект в базу данных, я создам JSON с атрибутом команды addObject и другим объектом, который является данными. Как только это будет выполнено, фоновые сценарии отправляют ответ, в котором говорится, что он был успешным.

Другим вариантом использования функции будет запрос данных, и в этом случае она отправит объект назад, а не успешно / неудачно.

Код становится хакерским, когда я начинаю пытаться получить возвращенный объект из фонового скрипта.

Кажется, что здесь, вероятно, есть простая проблема проектирования, с которой я не знаком. Некоторые люди предлагали будущие / обещающие проблемы дизайна, но я не нашел очень хорошего примера.

Сценарий содержания

function sendCommand(cmdJson){
   chrome.extension.sendRequest(cmdJson, function(response){
       //figure out what to do with response
   });
}

Фоновый скрипт

if (request.command == "addObject"){
  db[request.id]= JSON.stringify(request.data); 
   sendResponse("success");
}
else if(request.command == "getKeystroke"){
 var keystroke = db[request.id];
 sendResponse(keystroke);
}

1 Ответ

1 голос
/ 13 февраля 2012

Ваша система выглядит нормально, и вот некоторые незначительные улучшения.

Для каждой удаленной команды отправьте обратно объект того же типа (возможно с пустыми полями):

var response = {
    success: true, // or false
    data: {},
    errors: [],
    callback: ''
}

Также, еслиу вас есть несколько различных команд, которые отправляют данные назад, вы можете заменить if-else поиском объекта:

var commands = {
    addObject: function () { /* ... */ },

    getKeystroke: function (request, response) {
        response.data = db[request.id]
    }
}

Затем, если у вас есть какие-либо данные для ответа, просто добавьте их к объекту.И отправьте один и тот же объект для любой команды:

var fn = commands[request.commands]
fn(request, response)

Что касается выяснения, что делать с ответом, я передам обратный вызов в функцию sendCommand, и пусть скрипты содержимого запрашивают и обрабатывают ответданные по своему усмотрению:

function sendCommand(cmdJson, callback){
   chrome.extension.sendRequest(cmdJson, callback)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...