我有一个异步执行程序,它向具有id的服务器发送请求。服务器执行请求,执行程序将能够从响应中的相同id值中识别工作项promise
。请求可能会超时。在这种情况下,我希望执行程序完全删除此请求的ID。但是,当未来超时并且服务器没有ID时,我不知道如何识别此承诺。
为简洁起见,我发布了一个简化示例。
struct Executor {
std::map<work_id_t, std::promise<Result>> work_items;
};
// run requests asynchronously
std::future<Result> Executor::post_work(Request r, work_id_t id) {
work_items[id] = std::promise<Result>();
do_request(w);
return work_items[id].get_future();
}
// called when a requests finishes (the server supplies the id)
void Executor::work_finished(work_id_t id, Result r) {
work_items[id].set_value(r);
work_items.erase(id);
}
// ...
Executor e;
auto ft = e.post_work(Request("foo"));
auto wait_result = ft.wait_for(timeout_value);
if (wait_result == std::future_status::timeout) {
e.remove_item(???); // what can I pass here?
}
如何在超时发生时实现remove_item
功能?或者,如何更改我的设计以允许类似的机制?
答案 0 :(得分:1)
在您提供的界面中,// routes/studentlist.js
model(params) {
return this.get('store')
.query('student', { orderBy: 'class_id', equalTo: params.class_id })
.then((students) => { return students.toArray(); });
}
的调用似乎可以使用work_id_t
。
因此,由于调用者在超时时需要id,所以只需从Executor::post_work
返回future和id:
也许将它包装在一个结构中,例如:
post_work
如果您从struct Work {
std::future<Result> ft;
work_id_t id;
};
返回Work
实例,则可以等待将来,如果超时,请使用ID删除该项
Executor::post_work
在您的示例中:
Work w = ...
auto wait_result = w.ft.wait_for(timeout_value);
if (wait_result == std::future_status::timeout) {
e.remove_item(w.id);
}