簡體   English   中英

JavaScript中的異步控制流

[英]async control flow in javascript

我正在為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循環的全局標志/計數器來暫停執行,但這似乎很容易導致應用程序掛起。

如果選擇使用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請求自動生成並返回它們)並手動解析/拒絕它們。 幾個月前,我在此發表了一篇博客文章 -可能會有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM