4

テーブルがいっぱいか空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ています。truefalsetableFilled()

実際that.tableFilled('tableName')に戻りますundefined

私が最後に達成しようとしていることは次のとおりです。

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

コールバックを使用せずreturnに、trueまたはfalse値を親関数に設定する方法はありますか?tableFilled()

4

1 に答える 1

5

非同期プロセスを処理しているため、値を直接返すことはできません。

ただし、できることは約束を返すことです。あなたの関数は、それが利用可能になったときにあなたにその価値を与えることを約束します。promiseから値を取得するには、コールバック関数を追加する必要があります。

コールバック関数を使用する必要がありますが、関数をネストする必要はありません。シリアル化するだけです。

これは現在のニーズの範囲外かもしれませんが、非常に興味深い概念です。あなたがもっと知りたいのならそれのためだけにグーグル。

簡単な例を次に示します。

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);
}
于 2012-02-10T21:13:54.287 に答える