Chrome扩展程序runtime.sendmessage等待回复

时间:2015-08-28 08:19:35

标签: javascript google-chrome-extension

我正在开发一个chrome扩展程序,我对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调用?

2 个答案:

答案 0 :(得分: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({});
})

答案 1 :(得分:1)

您应该考虑从旧的"存储localStorage中的数据,使用sendMessage" 范例查询背景到新的& #34;将数据存储在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会自动传播到其他已登录的个人资料。