gpt4 book ai didi

javascript - 与节点请求循环等待所有完成的请求

转载 作者:行者123 更新时间:2023-11-28 19:07:03 25 4
gpt4 key购买 nike

我使用节点请求ajax包。所以,我有一个循环,在每次迭代中它都会向我的服务器发出请求。

// realItems needs the complete value of items assigned
var realItems;

var items = [];
_.forEach(JSON.parse(body), (value, key) => {
request('myurl/' + id, (error, response, body) => {
items = JSON.parse(body)
});
});

如何捆绑 request 包中的所有请求,以便我可以将 items 变量的值分配给最后的 realItems

//编辑:

我使用react js,所以在这种情况下realItems是一个状态,我无法在每次循环迭代中触发它,因为渲染在每个setState上触发

最佳答案

有多种方法可以解决这个问题。这是一种不保留结果顺序的强力方法:

var items = [];
var cnt = 0;
_.forEach(JSON.parse(body), (value, key) => {
++cnt;
request('myurl/' + value.id, (error, response, body) => {
items.push(JSON.parse(body));
// if all requesets are done
if (--cnt === 0) {
// process items here as all results are done now
}
});
});
<小时/>

这是使用 Bluebird Promise 的版本:

var Promise = require('bluebird');
var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);

var promises = [];
_.forEach(JSON.parse(body), (value, key) => {
promises.push(request('myurl/' + value.id));
});
Promise.all(promises).then(function(results) {
// all requests are done, data from all requests is in the results array
// and are in the order that the requests were originally made
});

而且,这里有一个更简单的 Bluebird Promise 方法,它使用 Bluebird 迭代器:

var Promise = require('bluebird');
var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);

Promise.map(JSON.parse(body), function(value) {
return request('myurl/' + value.id);
}).then(function(results) {
// all requests are done, data is in the results array
});

关于javascript - 与节点请求循环等待所有完成的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31464357/

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