2015-08-28 43 views
1

我開發一個Chrome擴展,並具有索姆問題林與chrome.runtime.sendMessage功能Chrome擴展runtime.sendmessage等待對

下面是我的代碼設置:

chrome.runtime.sendMessage({ method : "getLocalStorage", key: "email" }, function (response) { 
    console.log("the response has been received"); 
}); 

console.log("I am here"); 

$.ajax({}); 

此打印出:

I am here 
the response has been received 

所以我的問題是,chrome.runtime.sendMessage與其餘代碼運行異步。所以我可以做的是將ajax放入sendMessage的響應函數中。唯一的問題是,我有3個事件的sendMessage返回不同​​的變量,我需要在做Ajax調用之前,所以這不幸是不可行的選擇。

有沒有什麼方法可以在所有sendMessage調用完成之前暫停ajax調用?

+0

爲什麼不,計算收到的響應,並且當您有3個響應時,執行ajax調用? – Lauromine

+0

您是否嘗試重塑['chrome.storage' API](https://developer.chrome.com/extensions/storage)?你是否在這裏查詢背景以閱讀'localStorage'?如果你這樣做,我可以展示一個更有效的方法。 – Xan

+0

@xan是的,我打電話給背景以檢索存儲在localStorage中的信息。用戶輸入他/她的電子郵件作爲存儲在擴展本地存儲中的設置。然後,在執行ajax調用之前,我通過sendMessage檢索這個。所以現在我的問題是,如果我更新我的電子郵件,並呼籲ajax調用,它會被髮送到舊的電子郵件地址,因爲它的更新異步。 –

回答

1

你應該考慮從舊切換「數據存儲在localStorage,查詢的背景sendMessage範式新「數據存儲在chrome.storage,隨時隨地存取」範例; chrome.storage API是專門爲此目的而製作的。

缺點是全部訪問變得異步。但至少你可以優化一下,比如,你可以膠水您的通話在一起:

chrome.storage.local.get([key1, key2, key3], function(data) { 
    // Use data.key1, data.key2, etc. 
    $.ajax({}); 
}); 

您甚至可以提供的默認值。有沒有尚未:

chrome.storage.local.get({key1: default1, key2: default2, key3: default3}, function(data) { 
    // Use data.key1, data.key2, etc. 
    $.ajax({}); 
}); 

最後但並非最不重要,您的chrome.storage.sync將自動傳播到其他已登錄的配置文件。

+0

謝謝xan。好的解決方案我沒有意識到storage.local。它適用於我的事業 –

1

一個選項是使用Async.js。然後,你可以做這樣的事情:

async.parallel([ 
    function(done) { 
     chrome.runtime.sendMessage({ your first message }, function (response) { 
      done(); 
     }); 
    }, 
    function(done) { 
     chrome.runtime.sendMessage({ your second message }, function (response) { 
      done(); 
     }); 
    }, 
    function(done) { 
     chrome.runtime.sendMessage({ your third message }, function (response) { 
      done(); 
     }); 
    } 
], function() { 
    console.log("I am here"); 
    $.ajax({}); 
})