1

ここに同様の質問がありますが、より広いネットをキャストするために別の方法で質問すると思いました。私はまだ実行可能な解決策に出くわしていません(私が知っている)。

XCode で JavaScript コマンドを発行し、executeSql コールバックから戻り値を取得したいと考えています。

私が読んでいる研究から、同期executeSqlコマンドを発行できません。私が最も近づいたのは、コールバックを取得するまでスピンロックを試みることでした。しかし、それもまだ機能していません。たぶん、私のスピンはコールバックに戻ってくる機会を与えていません (以下のコードを参照)。

Q: Ajax に関して、jQuery はどのように async=false 引数を持つことができますか? executeSql コマンドと XHR の違いはありますか?

これまでの私の概念実証は次のとおりです: (笑わないでください)

// First define any dom elements that are referenced more than once.
var dom = {};
dom.TestID = $('#TestID'); // <input id="TestID">
dom.msg = $('#msg'); // <div id="msg"></div>

window.dbo = openDatabase('POC','1.0','Proof-Of-Concept', 1024*1024); // 1MB

!function($, window, undefined) {
    var Variables = {}; // Variables that are to be passed from one function to another.

    Variables.Ready = new $.Deferred();
    Variables.DropTableDeferred = new $.Deferred();
    Variables.CreateTableDeferred = new $.Deferred();
    window.dbo.transaction(function(myTrans) {
        myTrans.executeSql(
            'drop table Test;',
            [],
            Variables.DropTableDeferred.resolve()
            // ,WebSqlError
        );
    });
    $.when(Variables.DropTableDeferred).done(function() {
        window.dbo.transaction(function(myTrans) {
            myTrans.executeSql(
                'CREATE TABLE IF NOT EXISTS Test' 
                + '(TestID Integer NOT NULL PRIMARY KEY'
                + ',TestSort Int'
                + ');',
                [],
                Variables.CreateTableDeferred.resolve(),
                WebSqlError
            );
        });
    });

    $.when(Variables.CreateTableDeferred).done(function() {
        for (var i=0;i < 10;i++) {
            myFunction(i);
        };
        Variables.Ready.resolve();
        function myFunction(i) {
            window.dbo.transaction(function(myTrans) {
                myTrans.executeSql(
                    'INSERT INTO Test(TestID,TestSort) VALUES(?,?)',
                    [
                        i
                        ,i+100000
                    ]
                    ,function() {}
                    ,WebSqlError
                )
            });
        };
    });
    $.when(Variables.Ready).done(function() {
        $('#Save').removeAttr('disabled');
    });
}(jQuery, window);

!function($, window, undefined) {
    var Variables = {};

    $(document).on('click','#Save',function() {
        var local = {};
        local.result = barcode.Scan(dom.TestID.val());
        console.log(local.result);
    });


    var mySuccess = function(transaction, argument) {
        var local = {};

        for (local.i=0; local.i < argument.rows.length; local.i++) {
            local.qry = argument.rows.item(local.i);
            Variables.result = local.qry.TestSort;
        }
        Variables.Return = true;
    };
    var myError = function(transaction, argument) {
        dom.msg.text(argument.message);
        Variables.result = '';
        Variables.Return = true;
    }

    var barcode = {};
    barcode.Scan = function(argument) {
        var local = {};

        Variables.result = '';
        Variables.Return = false;
        window.dbo.transaction(function(myTrans) {
            myTrans.executeSql(
                 'SELECT * FROM Test WHERE TestID=?'
                ,[argument]
                ,mySuccess
                ,myError
            )
        });
        for (local.I = 0;local.I < 3; local.I++) { // Try a bunch of times.
            if (Variables.Return) break; // Gets set in mySuccess and myError
            SpinLock(250);
        }
        return Variables.result;
    }

    var SpinLock = function(milliseconds) {
        var local = {};
        local.StartTime = Date.now();
        do  {
        } while (Date.now() < local.StartTime + milliseconds);
    }

    function WebSqlError(tx,result) {
        if (dom.msg.text()) {
            dom.msg.append('<br>');
        }
        dom.msg.append(result.message);
    }

}(jQuery, window);
4

1 に答える 1

1

executeSql コマンドと XHR の違いはありますか?

すこし。

Ajaxに関して、jQueryはどのようにasync=false引数を持つことができますか?

Ajax、またはむしろXMLHttpRequest、非同期であることに厳密に制限されているわけではありませんが、元の頭字語が示唆しているように、非同期の方が好まれています。

jQuery.ajax()のオプションは の引数にasync関連付けられています:boolean asyncxhr.open()

void open(
   DOMString method,
   DOMString url,
   optional boolean async,    // <---
   optional DOMString user,
   optional DOMString password
);

Web SQL データベースの仕様では、同期データベース APIも定義されています。ただし、主にWeb Workers用に定義されたインターフェースの実装でのみ使用できますWorkerUtils

window.dbo = openDatabaseSync('POC','1.0','Proof-Of-Concept', 1024*1024);

var results;
window.dbo.transaction(function (trans) {
    results = trans.executeSql('...');
});

スクリプトを実行している環境がこのインターフェイスを実装していない場合、非同期 API に行き詰まりreturn、結果を取得することはできません。疑わしい理由で、非同期タスクのブロック/待機を強制することはできません。

たぶん、私のスピンはコールバックに戻ってくる機会を与えていません (以下のコードを参照)。

于 2013-03-12T05:22:40.533 に答える