2017-02-12 11 views
0

Я использую модуль sqlite3 для node.js с электронным модулем. Я новичок в javascript и борюсь с обратными вызовами и асинхронным кодом.Как передать результаты SQLite в обратный вызов в Nodejs

Мое предназначение для запуска функции getTable, построения массива таблицы и передачи этого массива в функцию обратного вызова, которая является функцией useTable.

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

function getTable(callback) { 
    const sqlite3 = require('sqlite3').verbose(); 
    var testDatabase = new sqlite3.Database('app/data/testDatabase.db'); 
    var table = []; 
    var testRow = []; 
    testDatabase.each("SELECT * FROM test_Accounts", function(err, row) { 
     testRow.push(row.test_id); 
     testRow.push(row.test_creation_date); 
     testRow.push(row.domain); 
     testRow.push(row.test_login_url); 
     table.push(testRow); 
     testRow = []; 
    }); 
    testDatabase.close(); 
    callback(table); 
} 

И эта функция будет принимать массив таблицы и использовать его:

function useTable(table) { 
    //code that uses the table array passed to this function from the getTable function. 
} 

И я запускаю это так:

getTable(useTable); 

Когда я запустил это, консоль не обнаруживает ошибок. Кажется, функция useTable работает до того, как массив таблицы завершится в функции getTable, которая, как я думал, была одной из основных целей обратного вызова, дождаться запуска асинхронного кода (в этом случае построения массива), прежде чем принимать этот массив и передавая его другой функции.

Как я могу убедиться, что массив таблицы в функции getTable полностью сгенерирован, прежде чем передать его и запустить функцию useTable?

ответ

1

Вы должны использовать функцию testDatabase.all, чтобы получить все ваши строки сразу. Например:

testDatabase.all('SELECT * from test_accounts',callback) 

Пожалуйста, обратитесь к документации:

Запускает SQL запрос с заданными параметрами и вызывает обратный вызов со всеми строками результата после этого. https://github.com/mapbox/node-sqlite3/wiki/API#databaseallsql-param--callback

Еще одно замечание: В NodeJS, когда вы звоните в функции обратного вызова рекомендуется использовать первое возвращаемое значение как null или значение error.

function useTable(err,table){ 
    if (err){ 
    throw Err 
    } 
    else { 
    // Do something with the data 
    } 
} 

getTable(useTable)