0

我正在爲Chrome瀏覽器擴展,基本上可以使用書籤。 以下代碼位於彈出式html文件中,並且正文onload事件中正在調用bookmarkHelper()函數。它應該檢查是否存在名爲「TestFolder」的書籤文件夾。如果存在,它會刪除文件夾中的所有書籤。如果沒有,它會創建空文件夾。谷歌瀏覽器擴展中的變量值不一致

var rootFolder = undefined; 
function bookmarkHelper() { 
    // Create TestFolder folder if it doesn't exist 
    chrome.bookmarks.getTree(function(tree) { 
     otherFolder = tree[0].children[1].children; 
     rootFolder = undefined; 
     for(i=0; i<otherFolder.length; i++) { 
      if(otherFolder[i].title == "TestFolder") { 
       rootFolder = otherFolder[i]; 
       return; 
      } 
     } 
     chrome.bookmarks.create({'parentId': "2", 
         'title': 'TestFolder'}, 
         function(newFolder) {}); 
    }); 

    // Remove all bookmarks from the rootFolder 
    for (i=0; i<rootFolder.children.length; i++) 
     chrome.bookmarks.remove(rootFolder.children[i].id); 
} 

現在我的問題是,當文件夾中有書籤時,它不會刪除它們。但如果我將最後3行更改爲

setTimeout(function(){ 
    for (i=0; i<rootFolder.children.length; i++) 
     chrome.bookmarks.remove(rootFolder.children[i].id); 
}, 100); 

它刪除書籤。 在另一種情況下,當我檢查彈出窗口時,它會使用原始代碼刪除書籤。這很奇怪,我不知道該怎麼做。 我在這裏是否缺少一些匿名函數線程類型的概念?因爲AFAIK,JS是單線程的。

回答

2

Chrome API調用是異步的,所以如果您想要運行它們以便您需要將代碼放入回調函數中。此外,您的整個bookmarkHelper也應以異步方式重寫,假設您想在繼續之前等待書籤文件夾的創建。

function bookmarkHelper(callback) { 
    // Create TestFolder folder if it doesn't exist 
    chrome.bookmarks.getTree(function(tree) { 
     otherFolder = tree[0].children[1].children; 
     rootFolder = undefined; 
     for(i=0; i<otherFolder.length; i++) { 
      if(otherFolder[i].title == "TestFolder") { 
       rootFolder = otherFolder[i]; 

       //"return" here wouldn't return from bookmarkHelper as you probably expect 
       break; 
      } 
     } 

     //it would be easier to always just recreate TestFolder 
     if(rootFolder == undefined) { 
      chrome.bookmarks.create({'parentId': "2", 'title': 'TestFolder'}, callback); 
     } else { 
      // Remove whole rootFolder subtree 
      chrome.bookmarks.removeTree(rootFolder, function() { 
       chrome.bookmarks.create({'parentId': "2", 'title': 'TestFolder'}, callback);    
      }); 
     } 
    }); 


} 

//usage 
bookmarkHelper(function(testFolder) { 
    //do something with testFolder 
}); 

我重拍它始終刪除整個樹並重新創建它,否則,你將需要爲了繼續,這是討厭的並行執行監視時的chrome.bookmarks.remove回調一大堆完成。

+0

感謝您的幫助! :) – 2011-03-07 03:38:14

1

正確的是,JavaScript是單線程的,但是它經常使用'回調函數',當特定函數完成它的事情時它會運行,同時允許下面幾行代碼繼續運行。

您傳遞的函數chrome.bookmarks.getTree()不會立即執行;相反,當chrome.bookmarks.getTree完成其工作,然後獲得結果時,它會運行。與此同時,沒有等待,所以下面的代碼立即執行。

將最後三行移入傳入chrome.bookmarks.getTree的函數中,您可能會得到一些更明智的結果。

+0

謝謝!這就說得通了 :) – 2011-03-07 03:37:19