Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node.js中编写事件发射器,使';“您创建了一个函数”;“我的功能”;但是,当它运行时,你会称它为成功还是失败?_Javascript_Node.js_Design Patterns - Fatal编程技术网

Javascript 如何在node.js中编写事件发射器,使';“您创建了一个函数”;“我的功能”;但是,当它运行时,你会称它为成功还是失败?

Javascript 如何在node.js中编写事件发射器,使';“您创建了一个函数”;“我的功能”;但是,当它运行时,你会称它为成功还是失败?,javascript,node.js,design-patterns,Javascript,Node.js,Design Patterns,例如,我见过这样的函数,使用起来很方便: myFunction(data). success(function() { // success! }). fail(function() { // fail! }); 我看不出一个明显的方法来实现这一点。以下是我在查看Node.js文档后的悲伤尝试: var EventEmitter = require('events').EventEmitter; var testEmitter = function(x) { var e = new

例如,我见过这样的函数,使用起来很方便:

myFunction(data).
  success(function() { // success! }).
  fail(function() { // fail! });
我看不出一个明显的方法来实现这一点。以下是我在查看Node.js文档后的悲伤尝试:

var EventEmitter = require('events').EventEmitter;
var testEmitter = function(x) {
  var e = new EventEmitter();

  if (x) {
    e.emit('success', 'got: ' + x);
  } else {
    e.emit('failure', 'no x passed')
  }

  return e;
}
显然,如果您尝试将其称为:

testEmitter('hello').
  success(console.log('success!')).
  failure(console.log('failure!'));

  // TypeError: Object #<EventEmitter> has no method 'success'
testEmitter('hello')。
成功(console.log('success!'))。
失败(console.log('failure!'));
//TypeError:对象#没有方法“success”

实现此模式的最佳方式是什么?

这些被称为承诺或,在jQuery中广泛使用

jQuery1.5中引入的延迟对象是通过调用
jQuery.Deferred()
方法创建的可链接实用程序对象。它可以将多个回调注册到回调队列中,调用回调队列,并中继任何同步或异步函数的成功或失败状态

var EventEmitter = require('events').EventEmitter;

var testEmitter = function(x) {
  var e = new EventEmitter();

  process.nextTick(function(){
      if (x) {
        e.emit('success', 'got: ' + x);
      } else {
        e.emit('failure', 'no x passed')
      }
  })

  return e;
}

testEmitter("hello").on("success", function(results){
    console.log('success!' + results);
}).on("failure", function(error){
    console.log('failure!' + error);
})
延迟对象是可链接的,类似于jQuery对象的可链接方式,但它有自己的方法。创建延迟对象后,可以通过直接从对象创建链接或将对象保存在变量中并调用该变量上的一个或多个方法来使用以下任何方法


有。这个怎么样?我已经使用process.nextTick来模拟您希望在函数中执行的异步工作

var EventEmitter = require('events').EventEmitter;

var testEmitter = function(x) {
  var e = new EventEmitter();

  process.nextTick(function(){
      if (x) {
        e.emit('success', 'got: ' + x);
      } else {
        e.emit('failure', 'no x passed')
      }
  })

  return e;
}

testEmitter("hello").on("success", function(results){
    console.log('success!' + results);
}).on("failure", function(error){
    console.log('failure!' + error);
})
这可以“改进”为:


Sudsy把我们带到了那里,lipp把它带回家了。