0

私がやろうとしているのは (もっと良い方法があると思いますが)、HTTP 要求をネットワーク上のさまざまなホストに送信することです。WinJS.xhrループを呼び出すことで、すべてのホストをヒットできます。ただし、範囲を完了するには時間がかかりすぎます。

Fiddler で調べると、一度に 12 ほどのリクエストが送信され、タイムアウトになるまで待ってから、次の 12 ほどのリクエストに進むことがわかります。そのため、各リクエストのタイムアウトを短縮しようと考えました。私のニーズでは、ホストが 500 ミリ秒以内に応答しない場合、応答しません。

ドキュメントに従って、 へWinJS.xhrの呼び出しを十分に小さな設定で への呼び出しにラップしようとしましWinJS.Promise.timeoutたが、変更はありませんでした。promise タイムアウトを変更しても、実際のリクエストには影響しませんでした。

もう少し検索すると、使用するオブジェクトを変更してタイムアウトを設定できるという提案が得られました。これは、より速い速度でリクエストを爆発させるという点で、魅力のように機能しました. ただし、副作用があるようです。XMLHttpRequestWinJS.xhr

Fiddler でリクエストを監視すると、約 10 件ほどのリクエストが非常に迅速に開始され、その後すべてが終了します。「次のダースかそこら」は決して来ません。 ときどき(非同期呼び出しの半ランダム性に基づいて) フィドラーに表示される最初の 12 個ほどには、範囲の下限から 9 ~ 10 個、範囲の上限またはそれに近い値から 2 ~ 3 個が含まれます。

ここで最終目標を達成するために私が試すことができる何か、または他の方法はありますか? (この質問の範囲内で、最終的な目標は妥当な時間内に多数のリクエストを送信することですが、ネットワーク上の特定のサービスをスキャンするためのより良い全体的な方法に関する提案も歓迎します。)

4

1 に答える 1

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)
        });
});

もう 1 つのクールなトリックは、promise.any (対 .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");
        });
})();
于 2012-12-29T11:38:25.773 に答える