【发布时间】:2017-11-26 06:28:58
【问题描述】:
我遇到了需要处理嵌套回调的情况。请参阅Thing::process 函数。第二个g_thing.onAfterWalk() 回调永远不会被调用,因为父级回调一旦完成就会销毁它。
Thing g_thing;
void Thing::walk(int32_t x, int32_t y) {
if (SYSTIME() > m_walkEndTime) {
// Still walking
return;
}
auto obj = g_thing.localObject();
auto walkDuration = obj->getWalkDurationTo(x, y);
[..]
m_walkEndTime = SYSTIME() + walkDuration;
[..]
// Walk finished. Run callback
if (m_afterWalk) {
m_afterWalk();
m_afterWalk = nullptr;
}
}
void Thing::onAfterWalk(std::function<void(void)>& callback) {
m_afterWalk = callback;
}
void Thing::process() {
[..]
// Store a callback and walk
g_thing.onAfterWalk([]() {
// Store another callback
// After walking to 4321, 4321 do something else.
// My actual problem... Callback within callback
g_thing.onAfterWalk([]() {
std::cout << "Walking finished.\n";
});
// After walking to 1234, 1234 walk to 4321, 4321
g_thing.walk(4321, 4321);
});
g_thing.walk(1234, 1234);
}
如何处理这种嵌套回调?
我应该创建一个std::stack 可能带有回调队列吗?最好的方法是什么?
【问题讨论】:
-
那么,在散步之后,您希望再次调用
walk? -
基本上我想在到达第一个位置后
walk到另一个位置。 -
你不应该在走之前设置 onAfterWalk 回调吗? (在这两种情况下?)
-
@lockcmpxchg8b 好点。你是对的。我会改变的。我认为这个问题仍然是一样的。
-
我认为这将解决您的问题。您将在第一个将回调指针设置为 null 之前完成第二个 after-walk
标签: c++ function c++11 callback