2015-06-21 1 views
2

У меня есть этот аддон, который вставляет следующую «мета» TAG на страницы, которые она открывает. В конце я хочу закрыть все вкладки с помощью этой TAG на Заголовок страницы.Закрытие вкладок с определенным мета-тегом в firefox-addon с использованием javascript

<meta id="CLOSE_LATER"> 

Я написал простой для цикла:

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() возвращает обещание, разрешенное к ИСТИННОМ, это найти 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 вы заинтересованы в переменной this в функции success так, что каждый вызов success будет иметь правильный объект tab.

Обратите внимание, что я закомментирована лесозаготовками, потому что вы больше не имеете доступа к i, но если вы хотите, чтобы работать снова, вы просто должны инкапсулировать tab и i в новом объекте для каждой итерации цикла и связывается, что вместо этого.

Я не использовал этот трюк в обещании, прежде чем, возможно, решение обещания что-то сделает, чтобы сломать привязку, но, надеюсь, нет.

+0

Awesome ... !! это действительно сработало. Спасибо :) – Gabriel

Смежные вопросы