【问题标题】:Writing Async code in event driven way以事件驱动的方式编写异步代码
【发布时间】:2015-11-18 04:51:15
【问题描述】:

我是node.js 的programminfg,有时异步函数变得非常脏。 我想编写异步代码,但在事件发生时检索数据我知道承诺,但这并不是我想要的,只是我要求的是这样的

asyncFunc(error,dt,ld){
//some async code such as db operations
}

然后我想以事件方式获取数据

asyncFunc.on("dt",function(dt){do something});
asyncFunc.on("error",function(err){i have an error object});
asyncFunc.on("ld",function(ls){loading});

有什么办法可以做到这一点,我知道 promises 和一些 3rd 方库反对回调地狱,但我的问题尤其是我写了如何设计我的代码?

【问题讨论】:

  • 当您的异步代码解析时,您可以通过让您的异步代码检查所有 3 种情况来做到这一点。例如,让我们假设您正在执行 ajax 调用。当调用返回数据(或错误)时,您必须检查您支持的每个事件并警告您的事件调解器。如果它返回错误,则触发 'error' 事件,如果它返回数据,则触发 'dt' 事件等。就我个人而言,在厌倦了通过多个事件调用保持应用程序状态一致后,我切换到了 Promise。
  • 我将如何触发一个我不确定的事件,你能不能写一个例子作为答案,然后我可以选择作为解决方案
  • 下面的答案包含一个很好的内置节点调解器示例。

标签: javascript node.js design-patterns asynchronous event-driven-design


【解决方案1】:

使用 nodejs 事件

var asyncFunc = function(error,dt,ld){
    var events = require('events');
    var eventEmitter = new events.EventEmitter();

    //emit error
    eventEmitter.emit('error', new Error('some error'));
    //emit dt
    eventEmitter.emit('dt', 'some data for dt');
    //emit dld
    eventEmitter.emit('ld', {message: 'some details for ld', ld: ld});
    return eventEmitter;
}

//then
asyncFunc.on("dt",function(dt){/*do something*/});
asyncFunc.on("error",function(err){/*i have an error object*/});
asyncFunc.on("ld",function(ls){/*loading*/});

好文章here
nodejs官方event docs

【讨论】:

  • 这是我想的解决方案,但仍然有一些问题:) 我如何为一个事件返回多个值,我可以返回对象,例如加载让它成为文件上传类似于 on(" ld",function(预期,收到))
  • 您不能返回多个值,但您可以将它们包装成单个对象。就像我写的第三次发射一样
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2013-05-17
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多