2015-06-21 45 views
2

我有这个插件,它在打开的页面上插入以下“元”标签。向下结束时,我想关闭所有标签页眉。使用javascript在Firefox中使用特定元标签关闭标签

<meta id="CLOSE_LATER"> 

我已经写了一个简单的for循环:

var TAG = "CLOSE_LATER"; 
var tabs = require("sdk/tabs"); 

for(var i=0; i<tabs.length; i++){ 
    var tab = tabs[i]; 

     console.log("****START****"); 
     console.log("CLOSING TAB : "+i+"of : "+tabs.length); 
    searchTag(tab, TAG,i) 
    .then(function success(rValue) { 
     if (rValue) { 
      tab.close(); 
      console.log("CLOSED i: "+i);     
     } 
     else{ 
      console.log("NOT CLOSED i: "+i); 
     } 
    }, function failure(error) { 
     console.log("Error : searchTag()"); 
    }); 
    console.log("****END****");  
} 

凡searchTag()连接脚本的页面 “seachtag.js” 搜索TAG。

searchTag()返回解析为真的promise,它在页面上找到TAG,否则解析为FALSE。

示例情况:我有3个URL,其中只有URL-2和URL-3标记了TAG。所以只应该关闭URL-2 & 3,但只关闭URL-3。

下面是示例日志:

enter image description here

+0

我从输出中看到的是searchTag()返回TRUE/FALSE for循环继续,变量“tab”现在保持最后一个选项卡,并且由于searchTag()返回TRUE,它被关闭。如何暂停从前进到下一个循环,直到searachTag()返回一个值? – Gabriel

回答

0

试试这个:

var TAG = "CLOSE_LATER"; 
var tabs = require("sdk/tabs"); 

var success = function (rValue) { 
    if (rValue) { 
     this.close(); 
     //console.log("CLOSED i: "+i);     
    } 
    else{ 
     //console.log("NOT CLOSED i: "+i); 
    } 
}; 

for(var i=0; i<tabs.length; i++){ 
    var tab = tabs[i]; 

     console.log("****START****"); 
     console.log("CLOSING TAB : "+i+"of : "+tabs.length); 
    searchTag(tab, TAG,i) 
    .then(success.bind(tab), function failure(error) { 
     console.log("Error : searchTag()"); 
    }); 
    console.log("****END****");  
} 

结合的tab你在success功能感兴趣的this变量,以便每次调用success将具有正确的tab对象。

注意,我注释掉的记录,因为你不再需要i访问,但如果希望重新工作,你只好封装tabi在一个新的对象每次循环迭代,并绑定该网址。

我之前没有在承诺中使用过这个技巧,因此承诺解析可能会做某些事情来破坏绑定,但希望不是。

+0

真棒......!那真的有用。谢谢 :) – Gabriel