2012-05-08 4 views
1

Как обычно, у меня есть Googled это честный бит и читать в API передачи сообщений, но, опять же, мне пришлось прибегать к хорошим ребятам в StackOverflow.Задерживать скрипт до тех пор, пока все сообщения не будут отправлены?

Мой вопрос заключается в следующем: при передаче сообщений между фоновой страницей расширения и расширением содержимого Google Chrome существует ли способ сделать его асинхронным - то есть задержать JavaScript до тех пор, пока сообщения не будут обнаружены как успешно переданные?

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

В настоящее время я обхожу это с setTimeout(nextFunction, 250);, но это вряд ли является изящным или практичным решением, так как количество и размер передаваемых значений всегда меняются, и я не знаю, как долго он должен пройти значения. Кроме того, я бы предположил, что время прохождения относительно версии браузера и системы пользователя.

Одним словом, I необходимо это динамическое.

я рассмотрел что-то вроде

function passMessages(){ 
    chrome.extension.sendRequest({method: "methodName"}, function(response) { 
     localStorage["lsName"] = response.data; 
    }); 

    checkPassedMessages(); 
} 

function checkPassedMessages(){ 
    if (!localStorage["lsName"]){ 
     setTimeout(checkPassedMessages, 100); //Recheck until data exists 
    } else { 
     continueOn(); 
    } 
} 

, но мне нужно пройти довольно много данных (по крайней мере, 20 значений) и, честно говоря, это не практично !localStorage["lsName1"] && !localStorage["lsName2"] и т.д. и т.п. Кроме того, я даже не знаете, будет ли это работать или нет.

У кого-нибудь есть идеи?

Благодаря

Update: Еще нет ответа, к несчастью. Может ли кто-нибудь предложить какую-либо помощь? :/

+0

Какое расширение вы пытаетесь создать? Это действие браузера? Говоря «справочная страница расширения Google Chrome», вы имеете в виду фоновая страница html, которую вы включаете в раздел 'background.page' файла' manifest.json'? Вы пытаетесь отправить данные с фоновой страницы на сценарий содержимого или наоборот? –

+0

Я пытаюсь отправить данные из фоновой страницы в сценарий содержимого. – mythofechelon

+0

Кроме того, да, фоновая страница - это HTML-файл, содержащийся в файле manifest.json. – mythofechelon

ответ

0

Я не знаю, неверно ли я интерпретирую ваш вопрос. Насколько я понимаю, вы отправляете запрос с вашей страницы расширения на скрипт контента. Обработчик запросов в обработчике содержимого выполняет некоторую операцию над переданным сообщением, после которого вам нужен элемент управления обратно на странице расширения. Если это то, что вам нужно, у вас есть все в Google Extension Documentation. Следующий код работает

//Passing the message 
function passMessages(){ 
    chrome.extension.sendRequest({method: "methodName"}, function(response) { 
    //callback function that will be called from the receiving end 

    continueOn(); 
    }); 
} 

//Recieving the message 
chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
    //Do the required operation with the message passed and call sendResponse 

    sendResponse(); 
}); 
+0

Да, я думаю, вы интерпретируете это неправильно.Моя система передачи сообщений работает отлично. Я просто спрашивал, есть ли какой-то метод или дополнительный аргумент, который вы можете присоединить к функциям передачи сообщений, чтобы сделать их синхронными - заставить их ждать, пока процесс (передачи сообщений) не будет завершен, прежде чем продолжить. – mythofechelon

+0

Единственное различие между кодом, который вы опубликовали, и тем, который я опубликовал, является то, что я вызываю 'continueOn' в обратном вызове запроса. Вы отправляете сообщение. После того, как приемник будет выполнен с сообщением, он вызывает обратный вызов запроса при отправке запроса. Таким образом, сообщение передано, и управление программой возвращается отправителю только после того, как сообщение было обработано. Это в значительной степени то, что делают синхронные звонки. –

+0

Но у меня, вроде, 20 сообщений. Я не могу связать функцию с каждым проходом сообщения. Это еще менее практично, что я планировал делать. – mythofechelon

0

Вы можете решить общие (то есть, на любой платформе, где вы общаетесь между различными потоками исполнения) при этой проблеме путем сбора информации прошла, в ожидании какого-то следующий " go ", прежде чем вы начнете обрабатывать собранную информацию. Вы можете использовать ту же идею, чтобы отправитель ожидал полного ответа.

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

+0

Но мне все еще нужно знать, как это сделать? – mythofechelon

+0

Программная логика. - Что-то вроде while (not_go_message (recvd)) buffer + = recvd; Процесс (буфер); на любом языке, на котором вы решаете свою конкретную версию проблемы. –

+0

Я не думаю, что для JavaScript существует что-то подобное. – mythofechelon

Смежные вопросы