javascript - 我如何解决集中听众的个人 promise ?

标签 javascript node.js promise

我有一个事件监听器,它会在特定任务完成时接收事件(来自服务器)。我希望每个任务都封装在一个 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/

相关文章:

javascript - 我可以将 <object> 元素插入到伪类::之前的内容中吗?

javascript - 位置为 : auto to right: 0 won't animate 的 span 的 CSS 动画

ios - 使用NodeJS服务器进行移动身份验证的设计

javascript - 在 Map() 的条目上使用 Promise.all

JavaScript Promise.then 回滚

javascript - 如何从 javascript 中的现有数组创建对象数组?

javascript - "bwrap"未定义

javascript - 在 NodeJS 中使用相同的参数在回调函数中调用父函数

javascript - Node.js 中使用 BodyParser 解析 JSON 嵌套对象

javascript - 确保数组内嵌套数组的同步执行(Promise.all - 在 Promise.all 中)