0

ローカルストレージにWebSQLを使用するChromeのブラウザ拡張機能を作成しています。これらのコンポーネントの両方のコードは、非同期操作に大きく依存しているようです。私は非同期操作についてはよく理解していますが、これに大きく依存するコードを作成した経験はあまりありません。

例えば:

  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がオプションである場合、それはそれが遅延オブジェクトと呼ぶものの美しいシステムを持っています。これにより、非同期の状況を適切かつ効果的に管理できます。場合によっては、状況に応じて同期的に管理することもできます。

(遅延は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 に答える