Javascript в плагине Firefox: задержка цикла - PullRequest
1 голос
/ 02 ноября 2009

Мне известно, что при кодировании расширения мы не можем отложить вызов функции, кроме как с помощью вызова setTimeout, но вот что я пытаюсь достичь в плагине, который я разрабатываю для Firefox (это не для Кстати, JavaScript встроен в веб-страницу):

для (var i = 0; i

//Load a URL from an array
//On document complete, get some data 

}

Идея проста. У меня есть массив URL-адресов, которые я хочу проанализировать и извлечь некоторые данные из. Каждый из этих URL-адресов занимает некоторое время для загрузки. Поэтому, если я попытаюсь получить некоторые данные с текущей страницы, не дожидаясь загрузки страницы, я получу ошибку. Теперь единственный способ сделать это, как я знаю, заключается в следующем:

первая функция: функция () {

  //Load the first url
  setTimeout("secondfunction", 5000);

}

secondfunction: function () {

//Load the second url
setTimeout("thirdfunction", 5000);

} * * тысяча двадцать-один

И так далее ... Я знаю, что это явно не так ... Мне просто интересно, как люди достигают этого в JavaScript ...

РЕДАКТИРОВАТЬ: Извините, что не был более подробно ...

Ответы [ 3 ]

1 голос
/ 02 ноября 2009

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

Может быть, что-то вроде:

var index = 0;  
var urls = [ ..... ];  
function ProcessDocument() { ....; LoadNextDocument(); }  
function LoadNextDocument() { index++; /* Load urls[index] */; }  
document.body.onLoad = ProcessDocument;

Где-то там вам нужно проверить индекс> urls.length для конечного состояния.

1 голос
/ 02 ноября 2009

Я не уверен, что этот тип дурачества необходим, но я не разработчик расширений, так что кто знает. Если вы хотите именно такой подход, просто вызовите метод setTimeout для обращения к той же функции:

var index;
firstfunction: function() {
  // do something with `index` and increment it when you're done

  // check again in a few seconds (`index` is persisted between calls to this)
  setTimeout("firstfunction", 5000);
}
0 голосов
/ 17 августа 2010

У меня была такая же проблема, но я использовал рекурсию вместо зацикливания. Ниже приведен бегущий код, который изменяет innerHTML элемента путем циклического перемещения по списку. Надеюсь, что это полезно.

<Script type="text/javascript">
var l;
var a;
function call2()
{
    l = document.getElementById('listhere').innerHTML;
    a = l.split(",");
    call1(0);
}

function call1(counter)
{
    if(a.length > counter)
    {
        document.getElementById('here').innerHTML = a[counter];
        counter++;
        setTimeout("call1("+counter+")",2000);
    }
}

</Script>

    <body onload="call2()">
    <span id="listhere">3,5,2,8</span><Br />
    <span id="here">here</span>
...