javascript - 并行执行的事件发射器与 promise ?

标签 javascript promise eventemitter

我正在制作大量模块,每个模块都需要在不同阶段运行代码。我可以为每个阶段使用 Promise.all,例如:

const phase1promise = Promise.all([module1.phase1(),module2.phase1()]);
phase1promise.then(// do next phases)
或者,我可以使用“主”模块中的事件发射器,子模块会监听该事件发射器,以便了解何时运行阶段代码。反过来,主模块将监听这些子模块的事件发射器,以了解它们何时完成该阶段。我安装了这个事件发射器系统并且它正在工作,但我开始认为 Promise 可能会更好,特别是对于并行运行的代码而言。另外,也许 Promise 可以被认为是一种更标准的模式。想法?

最佳答案

将事件用于多次发生的事情 - 对于顺序数据,使用更专门类型的事件发射器:流。

对只发生一次的事情使用 Promise。

Promise 是一种请求-响应设计模式。你基本上:

doSomething.then(processResponse);

通过 async/await,promise 已成为执行各种类型的请求响应的非常强大的工具:并行、串行、批处理等:

// Parallel
results = await Promise.all(a,b,c);

// Serial
for (i=0; i<tasks.length; i++) {
    results.push(await tasks[i]());
}

// Batch 10 tasks in parallel
for (i=0; i<tasks.length; i += 10) {
    currentTasks = tasks.splice(0,10);
    results.push.apply(results, await Promise.all(currentTasks.map(t => t())))
}

但是,Promise 并不是为了拦截多个事件而设计的。一旦 Promise 解决了,其状态就会更改为已解决。

这就是通用事件发射器的用武之地。对于诸如 onclick 监听器、等待网络请求(请参阅 Express.js)、等待键盘输入之类的事情 - 不能使用 Promise(当然,除非您打算停止监听)处理一个事件后发生更多事件)。

对于本质上要求某些数据使用 promise 的事情。

但请注意,这两种模式都只是用于管理异步进程的设计模式。不要使函数异步。另请注意,异步进程可能是多线程的,也可能不是。对于网络 I/O,它们是单线程的 - javascript 基本上具有并行 等待,而不是并行执行指令。然而,有些模块允许您启动新线程或进程(浏览器中的 Web Worker 和 Node.js 中的 child_process)

<小时/>

工作线程

如果您查看 Web Worker,您会发现 API 是基于事件的。这是应该的,因为工作人员无法知道主进程将要求它何时执行以及执行多少工作。但是您可以轻松地将自己的主流程 API 包装在 Promise 中,因为它基本上是在执行请求-响应(当然,前提是每个请求只会触发工作线程仅发回一个响应)。

所以有时两者都可以 - 使用有意义的设计模式。

关于javascript - 并行执行的事件发射器与 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58965412/

相关文章:

javascript - 由于死域,是否可以重新路由预先存在的图像链接?

javascript - 从缓冲区创建新对象

javascript - Svelte react 性如何在函数内部工作?

javascript - 当超时调用时,AngularJS Promise 不会被取消

javascript - JavaScript ES promise 履行处理程序作业队列是否在所有 setTimeout 和 setInterval 处理程序队列之前执行?

node.js - Nodejs 事件被多次发出

javascript - Ajax请求返回空数组

javascript - 如何改进此 REST 请求 promise 代码?

重新订阅时出现 Angular ObjectUnsubscribedError

typescript - 在 Angular2 中从子组件切换父组件中的属性(类似于 AngularJS 中的 $emit)