Выполнение функций в серии - PullRequest
1 голос
/ 01 января 2011

Прежде всего ... С новым годом!

Не могли бы вы объяснить мне, как это работает? Я просматривал Подключить (https://github.com/senchalabs/connect) исходный код, но я его не понимаю.

Я хотел бы написать его сам.

app.get(
  '/',
  function(req, res, next) {
    // Set variable        
    req.var = 'Happy new year!';
    // Go to next function
    next();
  },
  function(req, res, next) {
    // Returns 'Happy new year!' 
    console.log(req.var); // <- HOW IS THIS POSSIBLE?
    // (...)
  }      
);

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

Если хотите, попробуйте использовать асинхронный модуль.Это значительно облегчает возможность работать последовательно, параллельно или использовать пул.

https://github.com/caolan/async

1 голос
/ 02 января 2011

Похоже, что первый аргумент функции, который вы предоставляете, сначала вызывается функцией get().

Когда он вызывается, для вызова предоставляется 3 параметра. Внутри вызова параметр req должен быть объектом, которому вы можете назначить свойства. Вы присвоили свойство var и присвоили ему значение 'Happy new year!'.

Следующий передаваемый аргумент функции вызывается посредством вызова параметра next(), и для вызова снова передаются 3 параметра. Первый параметр, по-видимому, является тем же объектом, который был передан первому вызову, которому вы присвоили свойство var.

Поскольку это (по-видимому) тот же объект, назначенное вами свойство все еще присутствует.

Вот простой пример: http://jsfiddle.net/dWfRv/1/ (откройте консоль)

// The main get() function. It has two function parameters.
function get(fn1, fn2) {
      // create an empty object that is passed as argument to both functions.
    var obj = {};
      // create a function that is passed to the first function, 
      //   which calls the second, passing it the "obj".
    var nxt = function() {
        fn2(obj); //When the first function calls this function, it fires the second.
    };
      // Call the first function, passing the "obj" and "nxt" as arguments.
    fn1(obj, nxt);
}

// Call get(), giving it two functions as parameters
get(
  function(req, next) {
      // the first function sets the req argument (which was the "obj" that was passed).
    req.msg = 'Happy new year';
      // the second function calls the next argument (which was the "nxt" function passed).
    next();
  }, 
  function(req) {
     // The second function was called by the first via "nxt",
     //   and was given the same object as the first function as the first parameter,
     //   so it still has the "msg" that you set on it.
    console.log(req.msg);
  }
);

Обратите внимание, что это очень упрощенный пример с меньшим количеством параметров в функциях. Кроме того, я изменил var на msg, поскольку var - зарезервированное слово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...