javascript - jQuery 如何执行 async :false in its $. ajax 方法?

标签 javascript jquery xcode asynchronous

我有一个similar question here ,但我想我应该以不同的方式提出问题,以撒下更广泛的网。我还没有找到可行的解决方案(据我所知)。

我希望 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);

最佳答案

Is there something different about XHR than there is about the executeSql command?

有点。

How can jQuery have an async=false argument when it comes to Ajax?

Ajax,或者更确切地说XMLHttpRequest ,并不严格限于异步——不过,如 original acronym建议,首选。

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

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

Web SQL Database规范还定义了 Synchronous database API 。然而,它是only available到主要为 Web Workers 定义的 WorkerUtils 接口(interface)的实现:

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

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

如果运行脚本的环境尚未实现此接口(interface),那么您将陷入异步 API 的困境,并且返回结果将不可行。您不能因为您怀疑的原因强制阻塞/等待异步任务:

Maybe my spinning isn't giving the callback chance to come back (See code below).

关于javascript - jQuery 如何执行 async :false in its $. ajax 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15353737/

相关文章:

javascript - 在级联下拉列表中失败,但首先使用 jquery Ajax 可以正常工作

jquery - 动态上下移动 Div 并具有可拖动效果?

ios - 应用程序安装失败。找不到代码签名

ios - 如何在文档 Xcode 中添加对另一种方法的链接/引用?

javascript - 使用多种类型的数据发布请求

ios - 使用 WebKit 加载 YouTube 视频时控制台中打印警告

javascript - 在 gMAP 中显示特定位置

javascript - 将 useState() 与事件监听器一起使用时遇到问题。看不到更新的状态

javascript - 我应该按什么顺序导入 Angular 文件?

javascript - 如何在 HTML <pre> 或 <code> 标签中显示包含代码的 AngularJS 变量?