2015-08-28 41 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({}); 
})