2012-04-18 3 views
0

У меня возникли проблемы с получением значений запроса скрипта содержимого из моего фонового сценария.Chrome Extension - sendRequest slow

content_script.js 
================= 
var elements = undefined 
var properties = undefined 
var targets = undefined 
chrome.extension.sendRequest({greeting: "elements"}, function(response) { 
    elements = response.input; 
}); 
if (elements == undefined){ 
    var elements = ["a","img"]; 
}else{ 
    elements = elements.split(','); 
} 
chrome.extension.sendRequest({greeting: "properties"}, function(response) { 
    properties = response.input; 
}); 
if (properties == undefined){ 
    var properties = ["alt","id","class"]; 
}else{ 
    properties = properties.split(','); 
} 
chrome.extension.sendRequest({greeting: "targets"}, function(response) { 
    targets = response.input; 
}); 
if (targets == undefined){ 
    var targets = ["onclick","href"]; 
}else{ 
    targets = targets.split(','); 
}... 
...More code and references to elements following... 

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

(для справки :)

background.js 
============= 
chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) { 
    switch (request.greeting){ 
     case "elements": 
       var elements = localStorage["elements"]; 
       sendResponse({input: elements}); 
       break; 
     case "properties": 
       var properties = localStorage["properties"]; 
       sendResponse({input: properties}); 
       break; 
     case "targets": 
       var targets = localStorage["targets"]; 
       sendResponse({input: targets}); 
       break; 
     } 
    }); 

Я был на этом в течение 3 часов (все еще учится, что я делаю с JS)

+0

Его 1 утра, и я собираюсь спать, завтра просмотрит ответы. – Static128

ответ

0

Uhhhhhm вы не можете сделать это:

chrome.extension.sendRequest({greeting: "properties"}, function(response) { 
    properties = response.input; 
}); 
if (properties == undefined){ // always undefined 
    var properties = ["alt","id","class"]; 
}else{ 
    properties = properties.split(','); 
} 

sendRequest is асинхронный.

И правильный способ проверки неопределенными является:

if (typeof properties == "undefined") 

Если вам нужны все эти вещи просто сделать 1 запрос и сделать все свои вещи внутри обратного вызова:

chrome.extension.sendRequest({greeting: "all"}, function(response) { 
    if (response.elements === null) { 
     var elements = ["a","img"]; 
    } else { 
     var elements = response.elements.split(','); 
    } 

    if (response.properties === null) { 
     var properties = ["alt","id","class"]; 
    } else { 
     var properties = response.properties.split(','); 
    } 

    if (response.targets === null) { 
     var targets = ["onclick","href"]; 
    } else { 
     var targets = response.targets.split(','); 
    } 
}); 

И в фоновом режиме :

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    switch (request.greeting){ 
     case "all": 
      sendResponse({ 
       elements: localStorage.getItem("targets"), 
       properties: localStorage.getItem("properties"), 
       targets: localStorage.getItem("targets") 
      }); 
      break; 
    } 
}); 
+0

Это имеет смысл, только что сделал это, и он отлично работал (после долгих размахов) – Static128