Как и Нарендра сказал , на данный момент вы 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 создает «замыкание» над переменной. Это означает, что, поскольку на переменную ссылаются внутри внутренней функции, она все еще будет доступна внутри этой внутренней функции еще долго после того, как внешняя функция вернулась.
Надеюсь, это поможет. :)