2013-03-19 40 views
7

Tôi đang làm việc trên tiện ích mở rộng của Google Chrome, tiện ích này phải chặn/chuyển hướng một số yêu cầu gửi đi. Vì mục đích này, tôi sử dụng trình nghe chrome.webRequest.onBeforeRequest. Để quyết định, có nên chặn yêu cầu hay không, tôi cần một số thông tin về yêu cầu tab được gửi từ đó. Tôi có thể lấy nó bằng cách sử dụng chrome.tabs.get(integer tabId, function callback), nhưng gọi lại là không đồng bộ, có nghĩa là nó có thể được gọi sau khi giá trị được trả về từ onBeforeRequest người nghe.Cuộc gọi đồng bộ trong tiện ích Google Chrome

chrome.webRequest.onBeforeRequest.addListener(function(details){ 
chrome.tabs.get(details.tabId, function(tab){ 
    // get info from tab 
}); 
// based on info from tab return redirect or not 
}), { 
urls: ["<all_urls>"], 
types: ["main_frame"] 
}, ["blocking"]); 

Có cách nào để đồng bộ hóa cuộc gọi không? Hoặc có thể một số tùy chọn khác.

+0

bao giờ con số này ra? –

Trả lời

11

Another answer on Stack Overflow khuyên bạn nên theo dõi các tab bên ngoài chức năng nghe của bạn, giúp tránh hoàn toàn vấn đề này.

Ví dụ mã:

/* 
* -------------------------------------------------- 
* Keep list of tabs outside of request callback 
* -------------------------------------------------- 
*/ 
var tabs = {}; 

// Get all existing tabs 
chrome.tabs.query({}, function(results) { 
    results.forEach(function(tab) { 
     tabs[tab.id] = tab; 
    }); 
}); 

// Create tab event listeners 
function onUpdatedListener(tabId, changeInfo, tab) { 
    tabs[tab.id] = tab; 
} 
function onRemovedListener(tabId) { 
    delete tabs[tabId]; 
} 

// Subscribe to tab events 
chrome.tabs.onUpdated.addListener(onUpdatedListener); 
chrome.tabs.onRemoved.addListener(onRemovedListener); 

/* 
* -------------------------------------------------- 
* Request callback 
* -------------------------------------------------- 
*/ 
// Create request event listener 
function onBeforeRequestListener(details) { 
    // *** Remember that tabId can be set to -1 *** 
    var tab = tabs[details.tabId]; 

    // Respond to tab information 
} 

// Subscribe to request event 
chrome.webRequest.onBeforeRequest.addListener(onBeforeRequestListener, { 
    urls: ["<all_urls>"], 
    types: ["main_frame"] 
}, ["blocking"]); 
+0

Chúc mừng. Tôi đã thêm một tiền thưởng vào điều này bởi vì tôi đã có một vấn đề tương tự với executeScript, và đây là con đường để đi. (Mặc dù tôi cũng phải thực hiện một số rebinding của requestListeners) –

+1

Hiệu ứng này có ảnh hưởng gì đến hiệu năng? Tôi đã chuyển sang sử dụng phương pháp này vì nó 'chỉ hoạt động' đối với tôi nhưng tôi có cảm giác khó chịu về các vấn đề về hiệu suất cho người dùng có nhiều tab. – regularjoe

Các vấn đề liên quan