2012-03-20 4 views
0

Я новичок в javascript и не могу найти решение этого вопроса. Я прочитал некоторые из подобных вопросов, но не выглядел так, как проблема была такой же, как у меня.Возвращает переменную 'undefined' от функции

я называю метод из script1 с этим кодом:

function turnPage(){ 
    var current = window.now; 
    var nextpage = getNextPage(current); 
    alert(nextpage); 
} 

В Скрипт2 есть SQLite и т.д.:

function getNextPage(Pid) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [], 
        function(tx, results) { 
      nextp = parseInt(results.rows.item(0).NextPage); 
      //alert(nextp); 
      return nextp; 
     }, errorCB); 
    }, errorCBQuery); 
} 

, если я использую предупредительного-диалог в вызываемой функции, переменная nextp равно 2. НО, если я верну переменную, она будет предупреждена как «неопределенная». Кроме того, если я и т. Д. Сделаю переменную var nextp = 11; над «db.transaction ...» и return-statement в конце функции, он вернет 11 вместо 2.

Это потому, что переменная не отправляется во внутреннюю функцию в начале моих функций ? :)

Любые идеи о том, что делать? благодаря!

ответ

1

Я не знаю, как работает SQLite в javascript, но я подозреваю, что он работает асинхронно, поэтому вы вызываете alert в turnPage, но транзакция выполняется как асинхронная, а возвращаемое значение все равно находится в другой области. Вы можете попробовать пропускание функции обратного вызова getNextPage, а затем вместо возвращения nextp вызова функции обратного вызова с nextp в качестве аргумента:

function turnPage(){ 
    var current = window.now; 
    getNextPage(current, function (nextp) { alert(nextp); /* do whatever else you need to do */ }); 
} 



function getNextPage(Pid, cb) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [], 
        function(tx, results) { 
      nextp = parseInt(results.rows.item(0).NextPage); 
      cb(nextp); 
     }, errorCB); 
    }, errorCBQuery); 
} 
+0

Thans, это сработало! (Если кто-то использует этот код, в предупреждении есть опечатка, он должен быть предупрежден (nextp), а не alert (nextpage) – TorK

+0

gah, true. Исправлена ​​опечатка. –

+0

@ user1255456 не забывайте принимать ответ, если он решил ваш проблема. –

0

Ваша внешняя функция никогда не возвращает nextp в любое время.

Есть два решения, что (я думаю) вы собираетесь делать

  1. Создать глобальную переменную и сохранить значение nextp там.
  2. Внесите еще один обратный вызов, чтобы использовать значение nextp, например, создать новую ссылку или что-то еще. Если вы хотите, вы можете поместить код в другую функцию и передать его как параметр в getNextPage() или поместить код непосредственно в самую внутреннюю функцию (в позиции вашего вызова alert).

Обратите внимание, что обратные вызовы используются для обработки асинхронного характера многих JavaScript-API. Поэтому даже ваш getNextPage() не может вернуть значение внутреннего запроса, поскольку это значение отсутствует, когда getNextPage() завершено.

В любом случае оператор return в самой внутренней функции можно отбросить, так как нет никакой функции для фактического получения этого значения.

0

Как теперь, есть несколько проблем с вашим кодом.

  1. В JavaScript в основном это asynchronus, код:

    nextpage = getNextPage(current); 
    alert(nextpage); 
    

    Позвоню getNextPage(), но он не будет ждать ответа, прежде чем перейти дальше, так что тревога будет срабатывать сразу же, и при этом если ответ не был возвращен и назначен (что, вероятно, будет иметь место), то nextpage будет неопределенным.

  2. Ваша вторая проблема заключается в том, что ваша внешняя функция ничего не возвращает. Вы возвращаете значение из своей внутренней функции, но затем «оно застревает» в вашей внешней функции. Одним из решений было бы присвоить значение глобальной переменной вместо того, чтобы возвращать ее из функции. Вам все равно придется искать «асинхронную проблему», чтобы вы не читали глобальную переменную, пока она не была назначена.

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