WinJS.xhr超时丢失请求?

时间:2012-12-29 00:15:37

标签: timeout xmlhttprequest winjs

我正在尝试做的事情(虽然I fully suspect there's a better way这样做)是将HTTP请求发送到我网络上的一系列主机。我可以通过循环调用WinJS.xhr来命中每个主机。但是,完成该范围需要很长时间。

在Fiddler中进行检查表明,一次发送了十几个请求,等待超时,然后继续下一打。所以我想我会尝试减少每个请求的超时。根据我的需要,如果主机在500毫秒内没有响应,它就不会响应。

关注the documentation后,我尝试用WinJS.xhr打电话给WinJS.Promise.timeout,并设置了足够小的设置,但没有任何变化。更改承诺超时并不会真正影响实际请求。

进一步搜索引导我a suggestion,我可以修改XMLHttpRequest使用的WinJS.xhr对象并设置超时。这对于以更快的速度爆破请求而言就像一个魅力。但是,似乎有副作用。

在Fiddler看到请求,大约十几个人很快就会开火,然后整个事情就结束了。 “未来十几个”从未到来。 有时(基于异步调用的半随机性)fiddler中显示的前十几个包括从低和范围的9-10和从顶端的2-3范围,或接近它。

还有其他我可以尝试的方法,或其他方式来实现最终目标吗? (在这个问题的范围内,最终目标是在合理的时间内发送大量请求,但是对于在网络上扫描特定服务的更好的整体方式的任何建议也是受欢迎的。)

1 个答案:

答案 0 :(得分:1)

你能写出你用于超时的代码,我写了这样的东西,但它没有用,所以我很好奇你是怎么做的:

    var timeoutFired = function () {
        console.log("derp");
    };

    var options = {
        url: "http://somesite.com",
        responseType: "document",
        customRequestInitializer: function (req) {
            req.timeout = 1;
            req.ontimeout = timeoutFired;
            //do something with the XmlHttpRequest object req
         }
    };

    WinJS.xhr(options).
    ....

以下是您可能会发现有用的一些替代方案,不知道如何/为什么超时不起作用但我尝试写出自定义超时功能:

(function (global) {
    var options = {
        url: "http://something.com",
        responseType: "document",
    };

    var request = WinJS.xhr(options).then(
        function (xmlHttpRequest) {
            console.log("completed");
        },
        function (xmlHttpRequest) {
            //error or cancel() will throw err
            console.log("error"+ xmlHttpRequest.message);

        },
        function (xmlHttpRequest) {
            console.log("progress")
    });  

    function waitTime() {
        return new WinJS.Promise(
            function (complete, error, progress) {
                var seconds = 0;
                var interval = window.setInterval(
                    function () {
                        seconds++;
                        progress(seconds);
                        //prob should be called milliseconds
                        if (seconds > 5) {
                            window.clearInterval(interval);
                            complete();
                        }
                    }, 100);
            });
    };

    waitTime().done(
        function () {
            console.log("complete");
            request.cancel();
        },
        function () {
            console.log("error")
        },
        function (seconds) {
            console.log("progress:" + seconds)
        });
});

另一个很酷的小技巧是使用promise.any(vs .join),当一个或另一个完成时会触发,所以考虑到这一点,你可以这样写:

 (function (global) {
    var options = {
        url: "http://url.com",
        responseType: "document",
    };

    var request = {
        runRequest: function () {
            return WinJS.xhr(options).then(
            function (xmlHttpRequest) {
                console.log("completed");
            },
            function (xmlHttpRequest) {
                //error or cancel() will throw err
                console.log("error" + xmlHttpRequest.message);

            },
            function (xmlHttpRequest) {
                console.log("progress")
            });
        }
    };

    WinJS.Promise.any([WinJS.Promise.timeout(500), request.runRequest()]).done(
        function () {
            console.log("any complete");
        });
})();