1

我在这里有一个类似的问题,但我想我会以不同的方式问它以撒下更大的网。我还没有遇到可行的解决方案(据我所知)。

我希望 XCode 发出 JavaScript 命令并从 executeSql 回调中获取返回值。

根据我一直在阅读的研究,我无法发出同步的 executeSql 命令。我最接近的是尝试旋转锁定,直到我收到回调。但这也没有奏效。也许我的旋转没有给回调机会回来(见下面的代码)。

问:当涉及到 Ajax 时,jQuery 怎么会有 async=false 参数?XHR 与 executeSql 命令有什么不同吗?

到目前为止,这是我的概念验证:(请不要笑)

// 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

XHR 与 executeSql 命令有什么不同吗?

有点儿。

当涉及到 Ajax 时,jQuery 如何具有 async=false 参数?

Ajax,或者更确切地说XMLHttpRequest,并不严格限制为异步 —— 不过,正如最初的首字母缩写词所暗示的那样,它是首选。

jQuery.ajax()async选项与 的boolean async参数相关xhr.open()

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

Web SQL 数据库规范还定义了同步数据库 API。但是,它仅适用WorkerUtils主要为Web Workers定义的接口的实现:

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 回答