0

我正在为 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 循环的全局标志/计数器来暂停执行,但这似乎很容易导致应用程序挂起。

4

1 回答 1

1

如果 jQuery 是一个选项,它有一个漂亮的系统,称为延迟对象。它允许对异步情况进行优雅和有效的管理 - 或者实际上是同步的,视情况而定或有所不同。

(Deferred 不仅限于 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 请求会自动生成并返回它们)并手动解析/拒绝它们。几个月前我写了一篇关于这个的博客文章——它可能会有所帮助。

于 2012-07-27T17:03:10.213 回答