2012-12-01 32 views
0

在我的分機的內容腳本,我從background.js請求數據,像這樣:消息回調同步誤差

fireOnNewTopic(); // Initial run on cold start or full reload. 

window.addEventListener ("hashchange", fireOnNewTopic, false); 

function fireOnNewTopic() { 
/*-- For the pages we want, location.hash will contain values 
    like: "#!newtopic/{group title}" 
*/ 
    if (location.hash) { 
    var locHashParts = location.hash.split ('/'); 
    if (locHashParts.length > 1 && locHashParts[0] == '#!newtopic') { 
     var subjectStr = ''; 
     var bodyStr = ''; 
     switch (locHashParts[1]) { 
      case 'opencomments-site-discussions': 
      chrome.extension.sendMessage({name:"domain"}, 
       function(response) 
       { 
       subjectStr = response.domain; 
       }); 
      chrome.extension.sendMessage({name:"url"}, 
       function(response) 
       { 
       bodyStr = "URL of last page visited: " +      response.url; 
       }); 
       break; 
      default: 
       break; 
     } 

     if (subjectStr && bodyStr) { 
      runPayloadCode (subjectStr, bodyStr); 
     } 
    } 
    } 
} 

不幸的是,因爲的sendMessage()的回調異步運行,在代碼到達runPayloadCode(時間),因爲background.js中的代碼尚未完成,所以subjectStr和bodyStr仍爲空。什麼是同步代碼的最佳方法,以便在調用runPayloadCode()時調用subjectStr和bodyStr?

+0

這是你在追求什麼? http://stackoverflow.com/questions/10783093/any-better-way-to-combine-multiple-callbacks –

回答

1

要闡述什麼蘇達說,大約兩個請求組合成一個(對不起,需要代碼,所以不能只評)這裏是你能做什麼?
發送

chrome.extension.sendMessage({url: true, domain:true}, function(response) { 
    console.debug('The url is "'+response.url+'" and the domain is"'+response.domain+'"'); 
    if (repsone.url && response.domain) { 
      runPayloadCode (subjectStr, "URL of last page visited: " + response.domain); 
     } 
}); 

或,如果你想讓它更象你這樣的情況下出於某種原因,也許這是你想要的東西八九不離十...

if(location.hash) { 
     var locHashParts = location.hash.split('/'); 
     if(locHashParts.length > 1 && locHashParts[0] == '#!newtopic') { 
      var subjectStr = ''; 
      var bodyStr = ''; 
      var request = {}; 
      switch(locHashParts[1]) { 
      case 'opencomments-site-discussions': 

       request = { 
        url: true, 
        domain: true 
       } 
       break; 
      default: 
       break; 
      } 

      chrome.extension.sendMessage(request, function(response) { 
       console.debug('The url is "' + response.url + '" and the domain is"' + response.domain + '"'); 
       if(repsone.url && response.domain) { 
        runPayloadCode(subjectStr, "URL of last page visited: " + response.domain); 
       } 
      }); 

     } 
    } 
} 

chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) { 
    var response = {}; 
    if(request.url) { 
     response.url = "someURL"; 
    } 
    if(request.domain) { 
     response.domain = "someDomain"; 
    } 
    sendResponse(response); 
}); 
+0

是的,我可以將兩個請求合併爲一個,並且該部分工作正常,但異步操作的基本問題仍然使我失望;見下面的評論。 – FractalBob

+0

@PAEz:再次感謝您的澄清,我很感謝您在糾正我的努力......謝謝:) – Sudarshan

0

你可以試試下面的代碼:

case 'opencomments-site-discussions': 
chrome.extension.sendMessage({ 
    name: "domain" 
}, 

function (response) { 
    subjectStr = response.domain; 
    if(subjectStr){ 
    chrome.extension.sendMessage({ 
     name: "url" 
    }, 

    function (response) { 
     bodyStr = "URL of last page visited: " + response.url; 
     if (bodyStr) { 
      runPayloadCode(subjectStr, bodyStr); 
     } 
    }); 
} 
}); 

但是,你不能合併這兩個消息的chrome.extension.sendMessage({name: "url"})chrome.extension.sendMessage({name: "domain"})到單個消息(因爲我看到他們無關)並消除多個嵌套?

+0

這並沒有解決異步操作的問題。如果我在內容腳本中設置了一個斷點以允許它等待偵聽器響應,當然,它可以工作;否則,它達到休息;數據返回之前。 – FractalBob

+0

按照PAEz的建議,我用下面的代碼替換了兩個sendMessage()調用,就像我說的,只要我強制內容腳本等待一段時間,我就會得到URL和域名:\t \t \t chrome.extension。的sendMessage(網址:{url:真實,域名:真正}, \t \t \t功能(響應) \t \t \t \t { \t \t \t \t subjectStr = response.domain; \t \t \t \t bodyStr =「最後一頁的訪問URL :「 + \t \t \t \t \t \t response.url; \t \t \t \t \t}); – FractalBob

+0

對不起,似乎無法在評論中格式化代碼。 – FractalBob