【问题标题】:Waiting for two asynchonous requests等待两个异步请求
【发布时间】:2014-07-11 18:14:50
【问题描述】:

我无法在 PHP 中发送两个请求并等待两个答案。这是我的代码:

        function getXDomainRequest() {
            var xdr = null;

            if (window.XDomainRequest) {
                xdr = new XDomainRequest();
            } else if (window.XMLHttpRequest) {
                xdr = new XMLHttpRequest({mozSystem: true});
            } else {
                alert("Your browser does not support AJAX");
            }

            return xdr;
        }

        function sendData() {
            var json1= "";
            var json2= "";

            var xdr = getXDomainRequest();
            xdr.onload = function() {
                json1 = xdr.responseText;
            }

            var xdr2 = getXDomainRequest();
            xdr2.onload = function() {
                json2 = xdr2.responseText;
            }

            var Id = document.querySelector('#searchField').value;
            // Call API
            xdr.open("GET", "./dorequest.php?id=" + Id + "&requesttype=player");
            xdr.send();

            xdr2.open("GET", "./dorequest.php?id=" + Id + "&requesttype=stats");
            xdr2.send();

            xdr.wait();
            // Display results
            getHtmlResults(jsonPlayer, jsonStats);
        }

正如预期的那样,json1 和 json2 在调用 getHtmlResults 时仍然为空。我可以通过将xdr2.send() 调用到xdr.onload 和xdr2.onload 中的最终函数来同步执行此操作,但我想异步执行此操作以获得更好的响应时间。

谢谢!

(欢迎对代码进行任何其他评论,我对 php 很陌生 :))

编辑:

所以我尝试使用 Ajax,它似乎可以工作 :)

            var jsonPlayer = "";
            var jsonStats = "";
            var steamId = document.querySelector('#searchField').value;
            $.when(
                $.ajax({url: "./dorequest.php?steamid=" + steamId + "&requesttype=playersummary",
                        success: function(response){ jsonPlayer = response; }}),
                $.ajax({url: "./dorequest.php?steamid=" + steamId + "&requesttype=csgostats",
                        success: function(response){ jsonStats = response; }}) ).done(
                function(player, stats) {
                            getHtmlResults(player, stats);
                        });

【问题讨论】:

  • 那是 Javascript,不是 PHP。

标签: javascript asynchronous xmlhttprequest xdomainrequest


【解决方案1】:

Promises 通常用作处理异步进程的抽象。

将你的 AJAX 调用封装在一个 Promise 中:

var ajax1 = request("stats");
var ajax2 = request("player");
when(ajax1, ajax2).done(function (stats, player) {
    console.log(stats, player);
});

大多数流行的框架都有一个内置的Promise API。

【讨论】:

    【解决方案2】:

    您可以发送两个调用 ASync 并在两个 .onload 中都有一个函数来检查另一个请求是否已完成。所以一旦一个onload发现另一个onload完成了,就可以调用getHtmlResults函数了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 2021-05-17
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多