我有一个事件监听器,它会在特定任务完成时接收事件(来自服务器)。我希望每个任务都封装在一个 promise 中,这样我就可以以一种干净的方式构建复杂的有序工作流。
我如何解决来自全局监听器的每个任务 promise (按 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??
}
});
最佳答案
是的,您需要从 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;
})
关于javascript - 我如何解决集中听众的个人 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674820/