5

たとえば、次のような便利な関数を見てきました。

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'

このパターンを実装する最良の方法は何ですか?

4

3 に答える 3

9

これは、次のように「改善」できます。

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')
    }
   })

  var self = {};
  self.success = function(f) {
    e.on('success',f);
    return self;
  };
  self.failure = function(f) {
    e.on('failure',f);
    return self;
  };
  return self;
};

testEmitter("hello").success(function(results){
  console.log('success!',results);
}).failure(function(error){
  console.log('failure!' + error);
})
于 2013-11-05T23:36:10.480 に答える
2

これはどう?私は 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);
})
于 2013-11-05T22:40:39.227 に答える
1

これらは promise またはDeferredとして知られており、jQuery で広く使用されています。

jQuery 1.5 で導入された Deferred オブジェクトは、jQuery.Deferred()メソッドを呼び出すことによって作成される連鎖可能なユーティリティ オブジェクトです。複数のコールバックをコールバック キューに登録し、コールバック キューを呼び出し、同期関数または非同期関数の成功または失敗の状態を中継できます。

Deferred オブジェクトは、jQuery オブジェクトがチェーン可能であるのと同様にチェーン可能ですが、独自のメソッドがあります。Deferred オブジェクトを作成した後、オブジェクトの作成から直接チェーンするか、オブジェクトを変数に保存し、その変数で 1 つ以上のメソッドを呼び出すことにより、以下のメソッドのいずれかを使用できます。

Deferreds を実装する多数のノード モジュールがあります。

于 2013-11-05T19:43:52.587 に答える