如何从集中式监听器解决个人承诺?

时间:2017-12-06 12:54:46

标签: javascript node.js 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??
  }
});

1 个答案:

答案 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;
})