Глобальный массив остается пустым - PullRequest
0 голосов
/ 04 ноября 2011

Я хочу добавить значения в testarray в функцию успеха. Мне нужно вернуть массив в тестовой функции, потому что я вызываю эту функцию в моем скрипте. Проблема в том, что массив остается пустым, когда я вызываю тестовую функцию. Как я могу решить эту проблему?

    function test()
    {
        var testarray=new Array();

        function success() 
        {

            testarray.push("test1");
        }

        return testarray;   
    }

Ответы [ 4 ]

1 голос
/ 04 ноября 2011

В вашем коде нет вызова на success.По этой причине testarray остается пустым.

Если вы вызываете success асинхронно, тогда значение testarray будет обновляться только после того, как success завершит выполнение, что происходит позднее.

Для проверки вы можете сделать это

function test()
{
    var testarray=new Array();
    function success() 
    {
        testarray.push("test1");
        console.log(testarray); //prints ["test1"]
    }
    return testarray;   //testarray is empty here because success has not yet finished.
}
0 голосов
/ 04 ноября 2011

Как и Нарендра сказал , на данный момент вы return testarray еще не были изменены, потому что функция success() еще не была вызвана. Поскольку вы не дали нам больше контекста, я предполагаю, что вы делаете что-то простое, поэтому я могу дать вам простой ответ. Предположим, вы хотите сделать что-то вроде этого:

for (testElement in test()) {
    console.log( testElement );
}

Теперь вы ожидаете, что test() вернет некоторые результаты, но возвращает пустое Array, поэтому ничего не происходит.

Чтобы исправить это, вы можете передать то, что вы хотите сделать, в тестовую функцию как функция:

function test(callback) {
    var testarray=new Array();
    function success() {
        testarray.push("test1");
        // Call the callback function:
        callback(testarray);
    }
}

myCallback = function(resultArray) {
    for (testElement in resultArray) {
        console.log( testElement );
    }
}

test(myCallback);
// After some time...
// console: test1

Хорошо, теперь все работает. Мы определили функцию обратного вызова, которая будет вызываться с testarray в качестве аргумента после завершения асинхронного кода. Но он, вероятно, все еще не делает то, что вы хотите, потому что он будет работать только один раз:

test(myCallback);
test(myCallback);
// After some time...
// console: test1
// console: test1

В тот момент, когда вы снова вызываете test(), он создаст новый пустой массив и, когда вызывается sucess(), нажмите "test1" на него. Это, вероятно, не то, что вы хотите (в противном случае, зачем вам использовать array?)

Итак, как нам это исправить? Ну, мы просто извлекаем массив из функции, например так:

function test(testarray, callback) {
    function success() {
        testarray.push("test" + (testarray.length+1));
        callback(testarray);
    }
}

myCallback = function(resultArray) {
    for (testElement in resultArray) {
        console.log( testElement );
    }
}

myTestArray = new Array();

test(myTestArray, myCallback);
test(myTestArray, myCallback);
test(myTestArray, myCallback);
// After some time...
// Console: test1
// Console: test1
//          test2
// Console: test1
//          test2
//          test3

Это работает по той же причине, почему testarray был доступен для функции success() в первую очередь: потому что JavaScript создает «замыкание» над переменной. Это означает, что, поскольку на переменную ссылаются внутри внутренней функции, она все еще будет доступна внутри этой внутренней функции еще долго после того, как внешняя функция вернулась.

Надеюсь, это поможет. :)

0 голосов
/ 04 ноября 2011

Вы должны вызвать функцию успеха.

function test() {
    var testarray = new Array();

    function success() {
        testarray.push("test1");
    }

    success();
    success();
    success();
    return testarray;
}
0 голосов
/ 04 ноября 2011

Ваша проблема в том, что вы объявляете только функцию success (), но не выполняете ее.Хотя функция не имеет для меня особого смысла, вы можете попробовать заменить свою функцию на:

(function(){
    testarray.push("test1");
})();

, которая определит новую анонимную функцию и немедленно вызовет ее.

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