persistence.js проблема с переносом результатов в массив - PullRequest
0 голосов
/ 19 июля 2011

Я использую файл persistence.js в проекте, и у меня возникают некоторые проблемы с переносом результатов запроса в массив.

// setup the region list array
var regionList = [];

// ping the database and grab all of the regions
var regions = Region.all().order('name');

// for each result, push the "display name" to the regions list array
regions.list(null, function(results) {
    results.forEach(function(r) {
        regionList.push(r.displayName);
    });
});

// alert the regions list array
alert(regionList);

"alert" абсолютно ничего не производит, однако, когда я пытаюсь сделать предупреждение в пределах "region.forEach" ... я получаю результаты. кажется, что объем массива не поддерживается, но я не уверен. насколько я понимаю, если я объявляю переменную вне функции, то эта переменная должна быть доступна в любое время, пока страница не закроется / не закроется ... я ошибаюсь? если я запускаю стандартный цикл for, я могу помещать динамические данные в массив - это действительно проблема с передачей в функции persistence.js.

Любое руководство будет с благодарностью. я мог бы сделать это во сне с php, но это мой первый шаг с persistence.js. заранее спасибо за помощь!

ура! -jon-

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Это не имеет ничего общего с областью видимости, а скорее с асинхронными обратными вызовами.

persistence.js - это асинхронный каркас, поэтому код не обязательно выполняется сверху вниз. Это распространенная ошибка людей, которые только начали работать с асинхронным Javascript.

С помощью вызова regions.list(...) (кстати, вы можете пропустить аргумент null), вы дадите выполнение - вы в основном говорите: всякий раз, когда вы получаете результаты из этого запроса, вызывайте эту функцию (это анонимно). функцию, которую вы передаете list). Затем выполнение продолжается, выполняя alert, пока regionList еще пуст (потому что в то время запрос еще не завершился).

Позже, когда запрос заканчивает выполнение, вызывается функция обратного вызова, заполняющая массив.

Итак, как это исправить: переместите alert внутрь функцию обратного вызова:

regions.list(null, function(results) {
    results.forEach(function(r) {
        regionList.push(r.displayName);
    });
    alert(regionList);
});
0 голосов
/ 20 июля 2011

Я не знаком с persistence.js, но мое первое предположение состоит в том, что методы list и / или forEach неблокируют и что строка alert(regionList); выполняется до того, как список и forEach успели первый толчок на массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...