可以通过函数循环 "Too Fast" 打破它 (Node.js)
Can Looping Through a Function "Too Fast" Break It (Node.js)
我正在尝试在服务器上累积 API 响应,并将它们作为单个对象 return 发送给客户端。为此,我循环遍历数组中的项目并将响应映射回原始对象。这对于长度为 1 的数组工作正常,但在遍历更大的数组时记录空白。
当遍历数组时,Node 会创建函数的新实例,还是即使它还没有 returned 值,它也会继续将数据传递到同一个函数中?
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)
})
}
.....
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)
}
})
如果 Node 正在重载该函数,我如何确保在再次 运行 函数之前接收到数据?
一个循环在循环返回之前等待其中的方法完成。因此,除非您使用 "threading" ,否则实际上没有真正快速移动的循环这样的东西,而您显然不是。
api 调用是异步的。
当 运行 循环时,代码在不等待答案的情况下进行许多休息调用。
如果循环不是太大,那么您可以使用递归来同步调用。
您还可以使用 nimble 同步调用:
我正在尝试在服务器上累积 API 响应,并将它们作为单个对象 return 发送给客户端。为此,我循环遍历数组中的项目并将响应映射回原始对象。这对于长度为 1 的数组工作正常,但在遍历更大的数组时记录空白。
当遍历数组时,Node 会创建函数的新实例,还是即使它还没有 returned 值,它也会继续将数据传递到同一个函数中?
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)
})
}
.....
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)
}
})
如果 Node 正在重载该函数,我如何确保在再次 运行 函数之前接收到数据?
一个循环在循环返回之前等待其中的方法完成。因此,除非您使用 "threading" ,否则实际上没有真正快速移动的循环这样的东西,而您显然不是。
api 调用是异步的。
当 运行 循环时,代码在不等待答案的情况下进行许多休息调用。
如果循环不是太大,那么您可以使用递归来同步调用。
您还可以使用 nimble 同步调用: