2013-02-28 6 views
7

मुझे पता है कि एक एसिंक्रोनस विधि की प्रतीक्षा बेवकूफ है, one should use callbacks instead। लेकिन क्या होगा यदि कोई तृतीय पक्ष एपीआई आपको तुल्यकालिक होने के लिए मजबूर करता है?एसिंक्रोनस विधि के कॉलबैक रिटर्न वैल्यू के लिए कैसे प्रतीक्षा करें?

मैं क्रोम एक्सटेंशन विकसित कर रहा हूं जो उपयोगकर्ता को उन वेबसाइटों पर जाने से रोक देगा जो पहले से ही किसी अन्य टैब में खुल चुके हैं। मुझे मूल रूप से खुले टैब में यूआरएल के आधार पर अनुरोध रद्द करने की आवश्यकता है। मैं chrome.webRequest.onBeforeRequest इस तरह उपयोग करना चाहते हैं:

function onBeforeRequest(details) { 
    var websiteAlreadyOpenInOtherTab; 

    // Here i want to set `websiteAlreadyOpenInOtherTab` by using the `chrome.tabs` 
    // API. It's asynchronous though and that's my problem. I cant return a value 
    // from an asynchronous method call. 

    if (websiteAlreadyOpenInOtherTab) { 
    return { cancel: true }; 
    } 
} 

chrome.webRequest.onBeforeRequest.addListener(
    onBeforeRequest, 
    { urls: ['<all_urls>'], types: ['main_frame'] }, 
    ['blocking']); 

उम्मीद है कि आप उपरोक्त कोड में मेरी दुविधा को देखते हैं। मुझे एसिंक्रोनस विधि कॉल के परिणाम के आधार पर एक ऑब्जेक्ट वापस करने की आवश्यकता है। क्या यह हासिल करना संभव है?

+1

नहीं, यह नहीं :-(है – Bergi

+0

क्या आप सभी 'chrome.tabs' परिवर्तनों को नहीं सुन सकते हैं और 'वेबसाइट पहले से ही ओपनइनऑथटैब' में पहले से ही सही मान है जब 'onBeforeRequest' कहा जाता है? – Bergi

+0

मुझे लगता है कि आप दृष्टिकोण हैं समस्या गलत तरीके से। सबसे पहले, अगर चीजों को असीमित होने की आवश्यकता है, तो सिंक्रोनस प्रतिक्रिया की आवश्यकता के बजाय, मॉडल के भीतर काम करें और एक एसिंक्रोनस कॉलबैक का उपयोग करें जिसमें आप तय करते हैं कि टैब खुला नहीं होना चाहिए, तो आप इसे बंद कर दें। टैब को बंद करने के लिए एक अलग एपीआई फ़ंक्शन है, आपको केवल पहले से ही झूठी वापसी की आवश्यकता नहीं है ... – davin

उत्तर

6

शायद आप समस्या टैब यूआरएल ?: का ट्रैक रखने के द्वारा chrome.tabs.query

  • का उपयोग करके हल कर सकते हैं

    1. एप्लिकेशन शुरू होता है, सभी खुले टैब यूआरएल पाने chrome.tabs.onUpdated और chrome.tabs.onRemoved की सदस्यता लें और जब वे बदलते हैं तो यूआरएल जोड़ें/हटाएं/अपडेट करें।

    documentation के आधार पर कोड उदाहरण के कुछ प्रकार:

    var tabUrlHandler = (function() { 
        // All opened urls 
        var urls = {}, 
    
        queryTabsCallback = function(allTabs) { 
         allTabs && allTabs.forEach(function(tab) { 
          urls[tab.id] = tab.url; 
         }); 
        }, 
    
        updateTabCallback = function(tabId, changeinfo, tab) { 
         urls[tabId] = tab.url; 
        }, 
    
        removeTabCallback = function(tabId, removeinfo) { 
         delete urls[tabId]; 
        }; 
    
        // init 
        chrome.tabs.query({ active: true }, queryTabsCallback); 
        chrome.tabs.onUpdated.addListener(updateTabCallback); 
        chrome.tabs.onRemoved.addListener(removeTabCallback); 
    
        return { 
        contains: function(url) { 
         for (var urlId in urls) { 
          if (urls[urlId] == url) { 
           return true; 
          } 
         } 
    
         return false; 
        } 
        }; 
    
    }()); 
    

    अब आप सीधे tabUrlHandler पूछने के लिए सक्षम होना चाहिए अपने onBeforeRequestMethod:

    function onBeforeRequest(details) { 
        var websiteAlreadyOpenInOtherTab = tabUrlHandler.contains(details.url); 
    
        if (websiteAlreadyOpenInOtherTab) { 
        return { cancel: true }; 
        } 
    } 
    
  • +0

    बहुत बढ़िया! एक बहुत विस्तृत उदाहरण के लिए धन्यवाद, यह वह मार्ग है जिसे मुझे लेना है। – Sven

    +0

    धन्यवाद! एक दिलचस्प सवाल के लिए +1! :) – nekman

    संबंधित मुद्दे