gpt4 book ai didi

node.js - 在Nodejs中递归处理

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

[
{
name: 'test1',
fields: [
{
name: 'test11',
fields: [
{
name: 'test111',
fields: [
{
name: 'test1111'
}
]
}
]
}
]
},
{
name: 'test2',
fields: [
{
name: 'test21'
},
{
name: 'test22'
}
]
}

]

我想在 nodejs 中递归地处理上面数组中的字段名称。由于 nodejs 异步行为,循环不工作。

最佳答案

您需要定义“过程”。如果它是同步的,没有什么特别的,显然:

function visit (visitor, obj) {
if (Array.isArray(obj)) return obj.forEach(visit.bind(null, visitor))
if (Array.isArray(obj.fields)) obj.fields.forEach(visit.bind(null, visitor))
visitor(obj)
}

function visitor (obj) {
console.log(obj.name)
}

visit(visitor, data)

如果在 visitor 中你想要一些异步的东西,有很多选择。假设您想要处理第一个 Node 的子 Node (并行),然后是 Node 本身:

// the order of arguments is weird, but it allows to use `bind`
function visit (visitor, callback, obj) {
var array
if (Array.isArray(obj)) array = obj
if (Array.isArray(obj.fields)) array = obj.fields

if (!array) return visitor(obj, callback)

// number of pending "tasks"
var pending = array.length
var done = false

function cb () {
// ensure that callback is called only once
if (done) return
if (!--pending) {
done = true

// after all children are done process the node itself
if (!Array.isArray(obj)) return visitor(obj, callback)

//if the whole node is array
callback()
}
}

array.forEach(visit.bind(null, visitor, cb))
}

function visitor (obj, callback) {
process.nextTick(function () {
console.log(obj.name)
callback()
})
}

visit(visitor, after, data)

function after () {
console.log('all done')
}

它基本上是相同的代码,但带有回调和一些异步流控制代码。当然,您可以使用 async 包来代替。

关于node.js - 在Nodejs中递归处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20897738/

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