2012-06-03 2 views
0

У меня есть приложение Node.js с асинхронным кодом вроде этого:Лучший способ передать состояние асинхронных функций в Node.js

var localvar1 = ...; 
var localvar2 = ...; 
var localvar3 = ...; 
// do async database query 
conn.query("select ...", function(err, res) { 
    // fetch results asynchronously 
    res.fetchAll(function(err, rows) { 
     if (rows.length == 0) // no, data, fetch from external HTTP source 
     { 
      // fetch from Internet asynchronously 
      https.get(..., function() { 
       // ok, got it, now save 
       // I need values from original function here *** 
       saveData(localvar1, localvar2, localvar3); 
      }); 
     } 
    }); 
); 

Каков наилучший способ передать значения localvar1-3 к внутренней функции ?

Если вы предлагаете какую-либо библиотеку для этого, укажите пример кода, который будет работать с кодом, который я написал выше.

+0

'// извлечение из Интернета asynchronously' части может быть функцией acepting вашего' localvar's (и что-то еще, если это необходимо). – elmigranto

+0

@elmigranto: как? пожалуйста, проверьте код. –

+0

Ваши переменные уже видны в самой внутренней функции, вам нужно больше деталей о том, что вы пытаетесь выполнить. – lanzz

ответ

1

Благодаря затворов, внутренние функции имеют доступ к локальным переменным, определенным во внешних функциях или в самом модуле, так что ваш код, как написано будет работать еслиlocalvar1, et.al., не изменятся во время ожидания ваш ответный вызов https.get(). Если они будут изменены, ваш обратный вызов увидит их новые значения, а не значения, которые они имели во время запроса. Если это проблема, создать новое замыкание в «ловушку» им:

https.get(..., (function(arg1, arg2, arg3) { 
    return function() { 
     saveData(arg1, arg2, arg3); 
    } 
})(localvar1, localvar2, localvar3)); 
Смежные вопросы