1

全て!

Node/Express/Socket.IO を使用して、同一のコールバックをリファクタリングしたいと考えました。

私は持っている:

io.sockets.on('connection', function(socket) {
    socket.on('find all notes' , function() { noteProvider.findAllNotes(function(err, result) {
        if(err) {
            socket.emit('err', err);
        } else {
            socket.emit('result', result);
        }
    }) });
    socket.on('find note by id', function(id) { noteProvider.findNoteById(id, function(err, result) {
        if(err) {
            socket.emit('err', err);
        } else {
            socket.emit('result', result);
        }
    }) });
}

しかし、むしろ次のようなものが欲しい:

io.sockets.on('connection', function(socket) {
    socket.on('find all notes' , function() { noteProvider.findAllNotes(callback) });
    socket.on('find note by id', function(id) { noteProvider.findNoteById(id, callback) });
}

コールバックをリファクタリングするにはどうすればよいですか? 次の 2 つの例は機能しません。

動作しません 1:

var callback = function(err, result) {
    if(err) {
        socket.emit('err', err);
    } else {
        socket.emit('result', result);
    }
}

動作しません 2:

io.sockets.on('connection', function(socket) {
    socket.on('find all notes' , function() { noteProvider.findAllNotes(callback(socket, err, result)) });
    socket.on('find note by id', function(id) { noteProvider.findNoteById(id, callback(socket, err, result)) });
}

var callback = function(socket, err, result) {
    if(err) {
        socket.emit('err', err);
    } else {
        socket.emit('result', result);
    }
}

コードを DRY に保つにはどうすればよいですか?

フロデ

4

1 に答える 1

0

ソケット変数にアクセスできる「doesnotwork1」を宣言すると、動作するはずです。これは次のように行うことができます。

io.sockets.on('connection', function(socket) {
  var callback = function(err, result) {
    if(err) {
      socket.emit('err', err);
    } else {
      socket.emit('result', result);
    }
  }

  socket.on('find all notes' , function() { noteProvider.findAllNotes(callback) });
  socket.on('find note by id', function(id) { noteProvider.findNoteById(id, callback) });
});

「doesnotwork2」でそれを解決しようとしたようです。これは、コールバックで関数を返すと機能します。

var callback = function(socket) {
  // Returning the callback which will be called when noteProvider is done.
  // Since it's in the closure of this function it will have a reference to socket.
  return function (err, result) {
    if(err) {
        socket.emit('err', err);
    } else {
        socket.emit('result', result);
    }
  }
}

io.sockets.on('connection', function(socket) {
  socket.on('find all notes' , function() { noteProvider.findAllNotes(callback(socket)) });
  socket.on('find note by id', function(id) { noteProvider.findNoteById(id, callback(socket)) });
}
于 2013-03-18T14:44:16.527 に答える