首頁>Program>source

我想發送HTTP請求N次.我希望最终获得有關每个請求結果的資訊。

執行請求功能一次很好.這是使用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)会print出来,它是一个空陣列。

關於承诺/迴報功能的鏈接/迭代有任何想法或指匯吗?

谢谢!

Update 後續問题以迴應@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);
});

因此,如果我事先知道需要呼叫的次數(以及要呼叫的函式),那麼我將了解如何使用它.關於如何获取陣列中返迴者(在此示例中)或runRequest(在我的原始示例中)的動態呼叫的任何提示?

最新回復
  • 4天前
    1 #

    這將迴答 update   問题的一部分:

    var buildCalls = function() {
      var calls = [];
      for (var i in stories) {
        calls.push(myFunc(i));
      }
      return calls;
    }
    return Q.all(buildCalls());
    

  • 4天前
    2 #

    Q還有其他功能可帮助基於Promise的工作流程.您需要使用的方法是 Q#all .如果您有一个承诺陣列,並且想要在所有全部成功實現後呼叫一个函式,則可以

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

    在完成所有請求的承诺後, success_callback   叫做.如果其中的任何拒绝,則   立即被呼叫。

    failure_callback

  • MongoDB C#:MongoDB C#-為不存在的元素获取BsonDocument
  • 使用Ghostscript或ImageMagick从PDF删除/删除所有圖像