6

HTTP リクエストを N 回送信したい。最終的には、これらの各リクエストの結果に関する情報を取得したいと考えています。

request 関数を一度実行するとうまくいきます。Q.defer() を使用した HTTP リクエスト関数は次のとおりです。

function runRequest() {
    var deferred = Q.defer(),
        start = (new Date).getTime(),
        req = HTTP.request(options, function(res) {
            var end = (new Date).getTime(),
            requestDetails = {
                reqStatus: res.statusCode,
                reqStart: start,
                reqEnd: end,
                duration: end - start
            }
            deferred.resolve(requestDetails);
        });
    req.on('error', function(e) {
        deferred.reject(e.message);
    });
    req.end();

    return deferred.promise;
}

これを行うと、期待どおりのデータが返されます。

runRequest().then(function(requestDetails) {
    console.log('STATUS: ' + requestDetails.reqStatus);
    console.log('Duration: ' + requestDetails.duration);
    console.log('Start: ' + requestDetails.reqStart);
    console.log('End: ' + requestDetails.reqEnd);

}, function(error) {
    console.log('Problem with request: ' + error);
})
.done();

繰り返すために、私はそれを for ループに当てはめようとしました:

function iterateRequests() {
    var deferred = Q.defer();
    var reqResults = [];
    for (var iteration = 0; iteration < requests; iteration++) {
        runRequest()
        .then(function(requestDetails) {
            console.log('STATUS: ' + requestDetails.reqStatus);
            reqResults.push(requestDetails);
        }, function(error) {
            console.log('Problem with request: ' + error);
        });
    }
    deferred.resolve(reqResults);
    return deferred.promise;
}

次に、次のように呼び出します。

iterateRequests()
.then(function(results) {
    console.log(results);
    console.log("in the success callback after iterateRequests");
}, function() {
    console.log("in the failure callback after iterateRequests");
})
.done();

最終的に成功コールバックに入ります (つまり、「iterateRequests 後の成功コールバックに」記録されます)。ただし、 runRequest(). then() コールバックからログを取得する前に console.log(results) が出力され、空の配列になります。

promise-return 関数の連鎖/反復に関するアイデアやガイダンスはありますか?

ありがとう!

@abject_error の回答に対するフォローアップの質問を更新します。

Q.allをチェックアウトしました。間違いなく私が必要とするもののように見えます。そして、私が取り組んでいたものよりもはるかに簡単です。それがどのように機能するかを理解するのに役立つ簡単なテストケースを作成しました。

var Q = require("q");

function returner(number) {
    var deferred = Q.defer();

    deferred.resolve(number);
    return deferred.promise;
}

function parent() {
    return Q.all([
        returner(1),
        returner(2),
        returner(4)
    ]);
}


parent()
.then(function(promises) {
    // works - promises gives me [1, 2, 4]
    console.log(promises);
});

したがって、呼び出す必要がある回数 (および呼び出す関数) を事前に知っていれば、どのように使用できるかがわかります。配列内の returner (この例) または runRequest (私の元の例) への呼び出しの動的な数を取得する方法に関するヒントはありますか?

4

2 に答える 2

5

Q には、Promise ベースのワークフローを支援する他の機能があります。使用する必要があるメソッドはQ#all. promise の配列があり、それらすべてが正常に実行されたときに関数を呼び出したい場合は、次のようにします。

Q.all(array_of_promises).then(success_callback, failure_callback);

すべてのリクエストの約束が果たされた後、success_callbackが呼び出されます。それらのいずれかが拒否された場合、がfailure_callbackすぐに呼び出されます。

于 2013-06-07T05:10:57.207 に答える