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?
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