我有一个事件监听器,只要特定任务完成,它就会接收事件(来自服务器)。我希望每个任务都包含在一个承诺中,这样我就可以以一种干净的方式构建复杂的有序工作流。
我如何从全局侦听器中解析每个任务承诺(通过id)? 这是我想要实现的一个概念性例子。
// list of all tasks
var tasks = {}
tasks['id-1'] = getTask('id-1')
tasks['id-2'] = getTask('id-2')
// do task in order
// each task will issue request to server, and wait for reply
tasks['id-1'].startPromise()
.then(function(result) {
// start second task from first task's data
return tasks['id-2'].startPromise(result);
})
.then(function() {
// finalized task works
return true;
});
// listen to task finish
client.listen('onReceive', function(event) {
if(event.is('taskFinished')) {
var id = event.taskId;
tasks[id].resolve(event.result); //How do I resolve task from listener??
}
});
答案 0 :(得分:3)
是的,您需要从ID到解析器功能的全局映射。
const tasks = new Map;
function runTask(id, data) {
return new Promise(resolve => {
// if (tasks.has(id)) throw new Error("cannot run multiple "+id+" at once");
tasks.set(id, resolve);
client.fire('start', id, data); // or whatever you need to trigger the task
})
}
client.on('taskFinished', event => { // or however you get notified of finished tasks
const id = event.taskId;
if (tasks.has(id)) {
tasks.get(id)(event.result);
tasks.delete(id);
}
});
如果您愿意(或需要ES5兼容性),您也可以使用普通对象而不是ES6 Map
,并且您可以编写侦听器,使其仅在映射不为空时才处于活动状态。
你会像
一样使用它runTask('id-1').then(result =>
runTask('id-2', result)
).then(() => {
console.log("both done");
return true;
})