Рассмотрим этот код (сокращенно)

function getSecret() {
    db.transaction(
        function (transaction) {
            transaction.executeSql(
                'SELECT * FROM table LIMIT 1;',
                null,
                function(transaction, result) {
                    var row = result.rows.item(0);
                    var secret = row.secret;
                    return secret;
                }, errorHandler
            );
        }
    )
}

Как бы я вернул значение секрета в основную функцию? Я прочитал этот ответ Возвращаемое значение из вложенной функции в Javascript

И попробовал это

function getSecret() {
    db.transaction(
        function doSql(transaction) {
            transaction.executeSql(
                'SELECT * FROM table LIMIT 1;',
                null,
                function(transaction, result) {
                    var row = result.rows.item(0);
                    var secret = row.secret;
                    return secret;
                }, errorHandler
            );
        }
    )
    return doSql;
}

Однако это не сработало.

Благодарность!

7
Pete 30 Июл 2010 в 21:26

3 ответа

Лучший ответ

Пытаться:

function getSecret() {
    var secret = '';

    db.transaction(
        function (transaction) {
            transaction.executeSql(
                'SELECT * FROM table LIMIT 1;',
                null,
                function(transaction, result) {
                    var row = result.rows.item(0);
                    secret = row.secret;
                }, errorHandler
            );
        }
    )

  return secret;
}
3
Sarfraz 30 Июл 2010 в 17:28
function getSecret() {
    var retval = undefined; // or a reasonable default
    db.transaction(
        function doSql(transaction) {
            transaction.executeSql(
                'SELECT * FROM table LIMIT 1;',
                null,
                function(transaction, result) {
                    var row = result.rows.item(0);
                    var secret = row.secret;
                    retval = secret;
                }, errorHandler
            );
        }
    )
    return retval;
}

Это создаст замыкание над переменной retval. Когда transaction вызывается, retval будет обновлен.

1
Fletcher Moore 30 Июл 2010 в 17:31

Попробуйте обещать работу базы данных перед возвратом полезной нагрузки.

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

Объявите обещание в функции:

function getSecret() {
    var secret = '';
    return new Promise(function(resolve, reject) {
        db.transaction(
            function(transaction) {
                transaction.executeSql(
                    'SELECT * FROM table LIMIT 1;',
                    null,
                    function(transaction, result) {
                        if (typeof(result) === 'undefined') {
                            var row = result.rows.item(0);
                            secret = row.secret;
                            resolve(secret)
                        },
                        else {
                            reject(transaction)
                        }
                    }
                );
            }
        )
    })
}

Затем вызовите функцию.

//If function resolves, log the secret. 
//if function rejects, log the transaction
getSecret().then(function(secret) {
    console.log(secret);
})
.catch(function(err) {
    console.log('Error in db.transaction ' + err)
})

Надеюсь, это поможет.

0
Daniel Le'Sage 8 Ноя 2016 в 06:15