2012-06-03 2 views
4

Я новичок в Javascript и пытаюсь написать дополнение Firefox.
Я пытаюсь передать/извлечь данные, возвращенные из SQL-запроса, вызывающей функции. Это не работает.
Я искал информацию об области видимости переменной, посмотрел на любой соответствующий пост, который я видел на этом сайте, и попробовал примеры, которые, как говорили, работали, но никто не работает для меня.возвращает данные от executeAsync к вызывающей функции (javascript/mozilla)

Я использую информацию хранения от:
https://developer.mozilla.org/en/Storage
https://developer.mozilla.org/en/mozIStorageStatement

Что мне делать неправильно, или как я должен это сделать?
Я запускаю firefox 12 на xp.

function Sqlite() { 
    this.dbConn = ""; 
    this.empty = true; 
} 

Sqlite.prototype.retrieveData = function(query) 
{ 
    var rows = new Array(); // to be returned to the calling function 
    var stmt = this.dbConn.createStatement(query); // my "select..." statement 

    stmt.executeAsync ({ 
    handleResult: function(aResultSet) 
    { 
     this.empty = false; 
     var i = 0; 
     for (let row; row = aResultSet.getNextRow();i++) { 
      rows[i] = row; 
     } 
    }, 

    handleError: function(anError) { 
     //some code 
    }, 

    handleCompletion: function(aReason) { 
     if (this.empty) { 
      // CODE FOR WHEN STATEMENT EXECUTION IS FINISHED 
     } 
     if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) { 
      document.getElementById("debug").value = rows[0]; //gets the data from the query: [xpconnect wrapped mozIStorageRow] 
      return true; 
     } 
    } 
    }); 
    document.getElementById("debug").value = rows[0]; //gets undefined 
    stmt.finalize(); 

    return rows; // the info is no longer available at this point. 
} 

Я очень ценю вашу помощь

ответ

4

Вы как-то туманно в том, как вы описываете вашу проблему, но когда вы пишете:

return rows; // the info is no longer available at this point.

это имеет курс ожидается. executeAsync, как следует из названия, является асинхронным. Это означает, что когда вы вызываете executeAsync, действие запланировано для последующего. Javascript имеет семантику запуска к завершению, поэтому выполнение будет продолжаться до тех пор, пока не будет достигнут оператор return rows. На данный момент запрос еще не выполнен! Как только ваша функция будет закончена, JS-движок выполнит ваш асинхронный оператор, и будет вызван ваш обратный вызов handleCompletion. Затем до кода в handleCompletion делать все, что хотите, с данными, например. вызовите другую функцию, чтобы что-то сделать с ней.

Кроме того, ваша empty переменная кажется ненужной.

handleCompletion: function(aReason) { 
    if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) { 
    // something went wrong 
    } else { 
    // do something useful with rows 
    } 
}, 

Наконец, вам нужно позвонить row.getResultByName, чтобы получить значение столбца в строке.

+0

Извините за неопределенное, я думал, что я был чист. Но вы поняли, потому что вы привели меня к решению. Спасибо за это. (Я извлек колонки, но это не имело значения для проблемы) Вот что я сделал:

 \t handleCompletion: function(aReason) { \t \t if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) { \t \t \t if (!this.empty) { \t \t \t \t return copyRes(rows, myRows, descResults); \t \t \t } \t \t } \t \t else { \t \t Cu.reportError("Async statement execution completed (" + aError.result + \t \t "): " + aError.message); \t \t } \t } 
Однако, это элегантный способ сделать это? – Laurel

+0

Я бы проголосовал за тебя, но я слишком стар. Недостаточно репутации. Еще раз спасибо – Laurel

+0

Я думаю, вы сбиваете с толку запрос, который успешно возвратил нулевые строки (потому что таблица пуста) с неудавшимся запросом (поскольку, например, db поврежден). В противном случае, да, это звучит прекрасно. –

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