Почему моя глобальная переменная не видна другой функции? - PullRequest
0 голосов
/ 18 ноября 2011

Это самая раздражающая проблема, с которой я когда-либо сталкивался:

var appslst = [];
function f1()
{
    chrome.management.getAll(function(lst)
    {
    appslst = lst;
    });
}

function f2() // this function isn't working!!
{
    var l = appslst.length;
    var ind = 0;
    while(ind < l)
    {
        document.getElementById("here").value = document.getElementById("here").value.concat(String(ind), ". ", appslst[ind].name, "\n");
        ind += 1;
    }
}

function f3()
{
     f1();
     f2();
}

Я считаю, что appslst - поскольку это глобальная переменная - должна быть видна в обеих функциях f1() и f2(),но приведенный выше код не работает, и я понятия не имею, почему.

Кроме того, я попробовал следующий код (и он работает):

var appslst = [];
function f1()
{
    chrome.management.getAll(function(lst)
    {
        appslst = lst;
        var l = appslst.length;
        var ind = 0;
        while(ind < l)
        {
            document.getElementById("here").value = document.getElementById("here").value.concat(String(ind), ". ", appslst[ind].name, "\n");
            ind += 1;
        }
    });
}

Еще несколько деталей.Я учусь, как создать расширение для Google Chrome.Я скачал образец: http://code.google.com/chrome/extensions/examples/extensions/app_launcher.zip по этой ссылке: http://code.google.com/chrome/extensions/samples.html. Я просмотрел код и нашел тот же код, который я написал, за исключением того, что он работает!

Вотчасть, о которой я говорю:

function onLoad()
{
  chrome.management.getAll(function(info)
  {
    var appCount = 0;
    for (var i = 0; i < info.length; i++) {
      if (info[i].isApp) {
        appCount++;
      }
    }
    if (appCount == 0) {
      $("search").style.display = "none";
      $("appstore_link").style.display = "";
      return;
    }
    completeList = info.sort(compareByName);
    onSearchInput();
  });
}

1 Ответ

2 голосов
/ 18 ноября 2011

chrome.management.getAll является асинхронным - следовательно, вам нужно передать функцию, которая выполняется только тогда, когда Chrome завершит выполнение getAll.

Это означает, что f1(); f2(); будет работать какэто:

  • f1 называется
  • getAll называется (это то, что делает f1)
  • f2 называется
  • перебирает appslst (это то, что делает f2)
  • (некоторое время между ними)
  • getAll готово;переданная ей функция называется
  • appslst заполняется данными из getAll (это то, что делает переданная функция)

Другими словами, appslst - этовсе еще пуст в момент вызова f2.Таким образом, вам также нужно приостановить f2():

chrome.management.getAll(function(lst){
    appslst = lst;
    f2(); // only run when getAll is done and appslst is filled
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...