我正在为chrome编写一个浏览器扩展,它使用Web SQL进行本地存储。这两个组件的代码似乎都非常依赖于异步操作。我对异步操作有很好的理解,但是在编写严重依赖它们的代码方面却没有很多经验。
例如:
var CSUID = "";
//this is an async callback for handling browser tab updates
function checkForValidUrl(tabId, changeInfo, tab) {
getCookies("http://www.cleansnipe.com/", "CSUID", handleCookie);
if(CSUID != ""){ //this could be in handleCookie if i could access the tab
//do stuff with the tab
}
}
function handleCookie(cookie) {
if (cookie != "" && cookie != null) {
CSUID = cookie;
}
}
为了克服缺乏向这些处理程序传递/返回变量的能力,我发现自己创建了全局变量并在处理程序中设置它们。当然,这不能按预期工作,因为变量通常在回调执行之前被访问。
处理这种情况的最佳做法是什么?我想使用带有while循环的全局标志/计数器来暂停执行,但这似乎很容易导致应用程序挂起。
答案 0 :(得分:1)
如果jQuery是一个选项,它有一个漂亮的系统,它称之为延迟对象。它允许对异步情况进行优雅有效的管理 - 或者实际上是同步的,因为案例可能是变化的。
(Deferreds不仅限于jQuery,但jQuery有一个很好的API)。
这是一个简单的例子,纯粹是为了展示这个概念。
//get data func
function get_data(immediate) {
//if immediate, return something synchonously
if (immediate)
return 'some static data';
//else get the data from something over AJAX
else
return $.get('some_url');
}
//two requests two get data - one asynchronous, one synchronous
var data1 = get_data(true), data2 = get_data();
//do something when both resolved
$.when(data1, data2).done(function(data1, data2) {
//callback code here...
});
延迟不必涉及AJAX;您可以创建自己的延迟对象(jQuery的AJAX请求自动生成并返回它们)并手动解析/拒绝它们。几个月前我did a blog post on this - 这可能会有所帮助。