Возврат значения из вложенной функции ее родителю без использования обратного вызова - PullRequest
4 голосов
/ 11 февраля 2012

Я написал следующее function, чтобы проверить, заполнена или нет моя таблица HTML5 openDatabase:

var that = this;
that.db = openDatabase('dbname', '1.0', "description", 1024 * 1024);

that.tableFilled = function( tableName ) {

    that.db.transaction(function ( tx ) {

        tx.executeSql('SELECT * FROM ' + tableName, [],
            function success( c, results ) {
                return ( results.rows.length > 0 ? true : false );
            },
            function fail() {
                console.log('FAiL');
            }
        );

    });

};

Я пытаюсь return значения true или false для tableFilled().

На самом деле that.tableFilled('tableName') возвращает undefined.

В конце я пытаюсь достичь:

if ( that.tableFilled('tableName') ){
    // ...
}

Есть ли способ, которым я могуreturn значения true или false для родительской функции tableFilled() без использования обратного вызова ?

1 Ответ

5 голосов
/ 11 февраля 2012

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

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

Вам все еще нужно использовать функцию обратного вызова, но вам больше не нужно вкладывать свои функции, вы можете просто их сериализовать.

Это может быть выходом за рамки ваших текущих потребностей, но это очень интересная концепция.Просто Google для этого, если вы хотите узнать больше.

Вот краткий пример:

function my_function() {
    var promise = new_promise();
    do_asynchronous(function callback(result) {
        promise.resolve(result); // gets called after 1 second
    });
    return promise;
}

var promise = my_function();
promise.done(function(result) {
    console.log(result);    // prints "yay!" after 1 second
});

function new_promise() {
    var handlers = [];
    return {
        "resolve": function (result) {
            for (var i = 0; i < handlers.length; i += 1) {
                handlers[i](result);
            }
        },
        "done": function (a_callback) {
            handlers.push(a_callback);
        }
    };
}

function do_asynchronous(callback) {
    setTimeout(function () {
        callback("yay!");
    }, 1000);
}
...