如何解决集中听众的个人承诺? [英] How do I resolve individual promise from a centralized listener?

查看:55
本文介绍了如何解决集中听众的个人承诺?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个事件侦听器,每当完成特定任务时,该侦听器都会(从服务器)接收事件.我希望将每个任务封装在一个Promise中,以便我可以以一种简洁的方式构造复杂的有序工作流.

I have an event listener, which will receive event (from server) whenever a specific task is done. I desire each task to be encapsulated in a promise, so that I can construct complex ordered workflow in a clean manner.

我如何解决全局侦听器的每个任务承诺(按ID)?这是我要实现的目标的概念示例.

How would I resolve each task promise (by id) from a global listener? Here's an conceptual example of what I am trying to achieve.

// 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到解析程序功能的全局映射.

Yes, you'd need a global mapping from ids to resolver functions.

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 ,并且可以编写侦听器,以便仅在映射不为空时才激活该侦听器

You can also use a plain object instead of the ES6 Map if you prefer (or need ES5 compatibility), and you might write the listener so that it is only active when the mapping is not empty.

您可以这样使用

runTask('id-1').then(result =>
    runTask('id-2', result)
).then(() => {
    console.log("both done");
    return true;
})

这篇关于如何解决集中听众的个人承诺?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆