gpt4 book ai didi

node.js - 在 Q 中链接任意数量的 promise

转载 作者:搜寻专家 更新时间:2023-10-31 22:28:09 24 4
gpt4 key购买 nike

我想发送 N 次 HTTP 请求。我想最终获得有关每个请求的结果的信息。

运行一次请求函数效果很好。这是使用 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 之后的成功回调中”)。但是,console.log(results) 在我从 runRequest().then() 回调获取日志之前打印,它是一个空数组。

关于链接/迭代 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(在我的原始示例中)的动态调用次数的任何提示?

最佳答案

这回答了问题的更新部分:

var buildCalls = function() {

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

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

return Q.all(buildCalls());

关于node.js - 在 Q 中链接任意数量的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16976573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com