Arrays Can循环通过一个函数;“太快了”;打破它(Node.js)
我试图在服务器上累积API响应,并将它们作为单个对象返回给客户端。为此,我循环遍历数组中的项,并将响应映射回原始对象。这对于长度为1的数组来说效果很好,但在较大的数组中循环时会记录空白 在数组中循环时,节点是否创建函数的新实例,或者即使尚未返回值,它是否仍将数据传递到同一个函数中Arrays Can循环通过一个函数;“太快了”;打破它(Node.js),arrays,node.js,for-loop,accumulate,Arrays,Node.js,For Loop,Accumulate,我试图在服务器上累积API响应,并将它们作为单个对象返回给客户端。为此,我循环遍历数组中的项,并将响应映射回原始对象。这对于长度为1的数组来说效果很好,但在较大的数组中循环时会记录空白 在数组中循环时,节点是否创建函数的新实例,或者即使尚未返回值,它是否仍将数据传递到同一个函数中 loopThroughArray(req, res) { for(let i=0; i<req.map.length; i++) { stack[i] = (callback) => {
loopThroughArray(req, res) {
for(let i=0; i<req.map.length; i++) {
stack[i] = (callback) => {
let data = getApi(req, res, req.map[i], callback)
}
}
async.parallel(stack, (result) => {
res.json(result)
})
}
如果节点正在重载函数,我如何确保在再次运行函数之前已收到数据?循环等待其内部的方法完成,然后再返回。因此,除非您使用的是“线程化”,否则实际上不存在运行速度非常快的循环。api调用是异步的 当运行循环时,代码会在不等待答案的情况下进行许多rest调用 如果循环不是太大,那么可以使用递归同步调用 您还可以使用灵活的方式同步通话:
您没有发送任何回拨。为了更清楚,我更新了问题。这是错误的。Rest调用是使用节点异步的。循环并不等待主体完成callin简单术语,而是同时运行两个循环。我有一个与递归同步的代码版本,但我试图通过使其更并行来加速它。节点本质上是异步的@matthew。您应该尽可能避免在节点中进行同步调用该函数不返回json,因为它是异步的。您可以使用回调读取api调用返回的json值,
getApi
函数体中的console.log
是否同步运行?@EvanBechtol Yes。。。我试图改进代码,但不确定为什么函数没有按预期返回JSON对象。
function getApi(req, res, num, cb) {
request({
url: 'https://example.com/api/' + num
},
(error, response, body) => {
if(error) {
// Log error
} else {
let i = {
name: JSON.parse(body)['name'],
age: '100'
}
console.log(body) // Returns empty value array.length > 1 (req.map[i])
cb(i)
}
})