【问题标题】:Wait for promise to resolve to within an emitter.on listener function等待 promise 解析到一个 Emitter.on 监听器函数中
【发布时间】:2017-08-01 16:50:32
【问题描述】:

someevent 事件被触发时,我只想等待承诺得到解决,然后再继续。但是 slowFunctionThatReturnsPromise 需要很长时间才能解决,并且整个过程在解决之前就关闭了。因此它永远不会完成。我原以为使用then 会等待承诺得到解决,但我不知道为什么它不等待。

emitter.on('someevent', listener)


var listener = function()
{
    x.slowFunctionThatReturnsPromise()
        .then(function()
         {
             console.log('done');
         })
}

【问题讨论】:

  • Waitingasynchronous 是相反的东西。 同步代码将在继续处理同一调用堆栈中的任何其他代码之前保持进程繁忙,而异步代码仅在当前运行之后被调用调用栈完成。
  • 我需要在退出listener函数之前解决slowFunctionThatReturnsPromise返回的promise
  • then 回调是异步执行的,因此根据 Promise 的本质(和意图),此类回调将不会在返回 Promise 之前执行,而是在当前代码之后执行任务已完成。所以:不可能。
  • 不,再一次,说“异步发生”的部分将在所有当前正在运行的代码都被执行之后执行,直到一个空调用到达堆栈。只有这样,事件队列才会被处理以执行任何挂起的异步代码。
  • 看在上帝的份上,如果这实际上是 mocha 退出问题,那么请描述真实问题并显示真实代码。如果您展示真正的问题,而不是您创建的隐藏真正问题的代码的抽象版本,我们总是在这里做得更好。

标签: javascript node.js promise eventemitter


【解决方案1】:

您是否在x.slowFunctionThatReturnsPromise() 前面缺少return

【讨论】:

  • 是的,但是节点EventEmitters 不关心监听器返回什么,所以这不会影响行为。
【解决方案2】:

你不能在 node.js 描述的“退出”事件上这样做

监听函数只能执行同步操作。这 Node.js 进程将在调用 'exit' 事件后立即退出 导致任何额外工作的侦听器仍在事件循环中排队 被抛弃。例如,在以下示例中,超时 永远不会发生:

https://nodejs.org/dist/latest-v7.x/docs/api/process.html#process_event_exit

您可以处理优雅的终止信号,然后在准备好时退出进程。

process.on('SIGINT', () => {
    x.slowFunctionThatReturnsPromise().then(function() {
        process.exit(0);
    })
});

【讨论】:

  • 抱歉,我用 exit 作为一个(坏的)例子,事件名称实际上是别的东西
  • 好的。在这种情况下,您也不能这样做,因为标准 EventEmitter 中的侦听器是同步的。这个事件发射器可能更适合你。 npmjs.com/package/async-eventemitter
  • 感谢您的链接,这肯定会起作用,但不幸的是我正在使用的事件发射器在 mocha 中,我不想修改 mocha npmjs.com/package/mocha
  • 您能否详细说明您需要做什么?它与摩卡咖啡有什么关系?
  • 测试失败github.com/mochajs/mocha/blob/master/lib/runner.js#L58 我需要在侦听器函数中执行一个需要 10 秒的函数,但是 mocha 进程在慢速函数执行之前结束,即使使用 .then
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多