2013-06-07 34 views
6

Tôi muốn gửi yêu cầu HTTP N lần. Tôi muốn cuối cùng có thông tin về kết quả của từng yêu cầu đó.Chaining một số lời hứa tùy ý trong Q

Chạy chức năng yêu cầu khi hoạt động tốt. Dưới đây là các yêu cầu HTTP chức năng sử dụng Q.defer():

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

Nếu tôi làm điều này, tôi lấy lại dữ liệu tôi mong đợi:

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

Để lặp, tôi đã cố gắng để phù hợp đó vào một cho loop:

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

Sau đó, tôi gọi nó là như thế này:

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

Tôi kết thúc vào cuộc gọi lại thành công (tức là, nó ghi lại "trong cuộc gọi thành công sau khi iterateRequests"). Tuy nhiên, console.log (kết quả) in trước khi tôi nhận được các bản ghi từ runRequest(). Sau đó() gọi lại và nó là một mảng trống.

Bất kỳ ý tưởng hoặc hướng dẫn nào về chuỗi/lặp lại các chức năng trả lời hứa hẹn?

Cảm ơn!

Cập nhật Theo dõi câu hỏi để đáp ứng với câu trả lời @ abject_error của:

Kiểm tra ra Q.all. Chắc chắn trông giống như những gì tôi cần. Và nó đơn giản hơn nhiều so với những gì tôi đang làm việc. Tôi đã thực hiện một trường hợp thử nghiệm đơn giản để giúp tôi tìm ra cách thức hoạt động:

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

Vì vậy, tôi thấy làm thế nào tôi có thể sử dụng nó nếu tôi biết trước số lần tôi cần phải gọi nó (và có chức năng tôi sẽ gọi). Bất kỳ lời khuyên về làm thế nào để có được một số năng động của các cuộc gọi đến returner (trong ví dụ này) hoặc runRequest (trong ví dụ ban đầu của tôi) trong mảng?

Trả lời

7

này trả lời các cập nhật một phần của câu hỏi:

var buildCalls = function() { 

    var calls = []; 
    for (var i in stories) { 

    calls.push(myFunc(i)); 
    } 
    return calls; 
} 

return Q.all(buildCalls()); 
+0

Hãy cho tôi một thời gian để có được điều này. Cảm ơn câu trả lời. Đó là chính xác những gì tôi cần. – Tayler

4

Q có các chức năng khác để hỗ trợ trong quy trình làm việc dựa trên Promise. Phương pháp bạn cần sử dụng là Q#all. Nếu bạn có một loạt các lời hứa, và bạn muốn gọi một chức năng khi tất cả trong số họ đã hoàn thành thành công, bạn làm

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

Sau khi tất cả những lời hứa yêu cầu được đáp ứng, success_callback được gọi. Nếu bất kỳ trong số họ từ chối, số failure_callback được gọi ngay lập tức.

+0

Cảm ơn abject_error. Hình như chính xác những gì tôi cần. Bất kỳ đề xuất về làm thế nào để có được một số năng động của các cuộc gọi hàm trong array_of_promises? Tôi đã thêm một số giải thích thêm cho câu hỏi của tôi ở trên. – Tayler

+0

Cảm ơn bạn đã cho tôi đi đúng hướng. – Tayler

+0

@Domenic - hi, có bất kỳ giới hạn (hợp lý) nào về kích thước của mảng không - Q sẽ điều khiển nó một cách cục bộ để nó không vượt quá giới hạn về số lượng tác vụ không đồng bộ có thể chạy cùng lúc trên máy. Ví dụ, các mục 10K sẽ được sắp xếp theo đợt/điều chỉnh? – arcseldon

Các vấn đề liên quan