не знаю как лучше, но я бы это отсортировал в порядке зависимостией и поочереди выполнял бы методы.
[
{
"method": "controller:method1",
"params": {},
"id": 1
},
{
"method": "controller:method2",
"params": {},
"id": 2,
"wait": 1
},
{
"method": "controller:method2",
"params": {},
"id": 3,
"wait": 1
},
{
"method": "controller:method2",
"params": {},
"id": 4,
"wait": 2
}
{
"method": "controller:method2",
"params": {},
"id": 5
}
]
привести к виду
[
[
{
"method": "controller:method1",
"params": {},
"id": 1
},
{
"method": "controller:method2",
"params": {},
"id": 5
}
],
[
{
"method": "controller:method2",
"params": {},
"id": 2,
"wait": 1
},
{
"method": "controller:method2",
"params": {},
"id": 3,
"wait": 1
},
],
[
{
"method": "controller:method2",
"params": {},
"id": 4,
"wait": 2
}
]
]
а потом уже как-то так
for _, step := range steps {
for _, f : range step {
f.method(f.params)
}
}
что-то похоже на на графы и топологическую сортировку