2010-12-15 8 views
1

У меня есть этот js-класс, который имеет анонимную функцию для получения некоторых результатов запроса. Поскольку функция, обрабатывающая результаты, анонимна, я не могу сохранить результаты в переменной this.var и использовать их где-то еще, так как это в анонимной функции ссылается на объект окна. Я не могу вернуть его как функцию возврата либо так, как я могу сделать с этими результатами, чтобы они были доступны где-то еще?Вопрос анонимной функции Javascript

someObject = { 
    // this.db is created, no need to paste that code 
    dbGetAnimals: function() { 
     this.db.readTransaction(function(tx) { 
      tx.executeSql("SELECT * FROM animals", function(tx, results){ 
       return results; 
      }) 
     }); 
    }, 
    printAllAnimals: function() { 
     var animals = this.dbGetAnimals(); 
     alert (animals);// undefined 
    } 
} 

someObject.printAllAnimals(); 
+1

dooooont отправляет sql из javascript-вызова, который открывает вам множество атак. – 2010-12-15 21:13:37

+0

веб-хранения мат. узнайте перед публикацией lol: http: //www.html5rocks.com/tutorials/webdatabase/todo/? todo = sddf – 2010-12-15 21:38:23

ответ

3

Вы можете создать локальную переменный для хранения вашей this ссылки. Ваша анонимная функция станет закрытием, поэтому она сможет увидеть, что локальная переменная var.

dbGetAnimals: function() { 
    var myself = this; 
    this.db.readTransaction(function(tx) { 
     tx.executeSql("SELECT * FROM animals", function(tx, results){ 
      myself.var = results; 
     }) 
    }); 
}, 
+2

Это самый простой способ сделать это. Но я думаю, что это уродливо. Если мне нужен обратный вызов для выполнения в контексте, я просто привязываю контекст, используя lib. Если вы не используете lib, это путь. См. Http://www.prototypejs.org/api/function/bind для подробного описания проблемы. – 2010-12-15 21:30:19

0

Это происходит потому, что анонимная функция в executeSql является функцией обратного вызова, которая не исполняется до compmetes запроса, который по определению будет после dbGetAnimals возвращения. Вот почему ваш вызов dbGetAnimals возвращается неопределенным.

Вы должны передать функцию обратного вызова получить resutls запроса внутри executSql обратного вызова:

someObject = { 
    // this.db is created, no need to paste that code 
    dbGetAnimals: function (callback) { 
     this.db.readTransaction(function(tx) { 
      tx.executeSql("SELECT * FROM animals", function(tx, results){ 
       callback(results); 
      }); 
     }); 
    }, 
    printAllAnimals: function() { 
     this.dbGetAnimals(function(animals) { 
      alert(animals) 
     }); 
    } 
} 


someObject.printAllAnimals(); 
+0

Я получаю: Непроверенный ReferenceError: животные не определены – 2010-12-15 21:32:49

2

Вы пытаетесь сделать традиционный синхронный/неблокируемому программирования, где вы хотите, чтобы сделать асинхронный программирование.

var someObject = function()({ 
    this.dbGetAnimals = function (callback) { 
     db.readTransaction(function(tx) { 
      tx.executeSql("SELECT * FROM animals", function(tx, results){ 
       callback(results); 
      }) 
     }); 
    }, 

    this.printAllAnimals = function (callback) { 
     this.dbGetAnimals(callback); 
    } 
})(); 

someObject.printAllAnimals(function(animals) { 
    alert(animals); 
} 

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

Смежные вопросы