从匿名的javascript函数中获取variables

我正在使用一个匿名函数来执行一些关于我使用Restler的get函数返回的工作:

 var some_function() { var outer_var; rest.get(url).on('complete', function(result, response) { if (result instanceof Error) { sys.puts('Error: ' + result.message); } else { var inner_var; // do stuff on **result** to build **inner_var** outer_var = inner_var; } }); return outer_var; } 

我怎样才能得到inner_var的值到some_function范围并返回? 我在这里写的是行不通的。

get调用是asynchronous的,需要一些时间并稍后调用callback函数。 但是,调用get之后,脚本会继续执行并转到下一条指令。 所以这里发生了什么事情:

  • 你打电话过来
  • 你返回outer_var(这仍然是未定义)…有时以后…
  • 得到结果已经到达,callback被调用。
  • outer_var被设置

你不能让你的some_function为asynchronous的东西返回一个值,所以你将不得不使用一个callback,而是让你的代码在处理完数据之后调用它。

 var some_function(callback) { rest.get(url).on('complete', function(result, response) { if (result instanceof Error) { sys.puts('Error: ' + result.message); } else { var inner_var; // do stuff on **result** to build **inner_var** callback(inner_var); } }); } 

像大多数节点模块一样,Restler也是一个基于事件的库,具有asynchronous调用。 所以在你return outer_var; completecallback不一定是被调用的(对于一些库,如果结果被caching了,但是你应该总是期望它被称为asynchronous)。

你可以看到这个行为,如果你添加一些日志logging:

 var some_function() { var outer_var; console.log("before registration of callback"); //<---------- rest.get(url).on('complete', function(result, response) { console.log("callback is called"); //<---------- if (result instanceof Error) { sys.puts('Error: ' + result.message); } else { var inner_var; // do stuff on **result** to build **inner_var** outer_var = inner_var; } }); console.log("after registration of callback"); //<---------- return outer_var; } 

所以,如果你想用这个值做一些事情,你需要调用一个函数来完成你的callback。

  1. 删除var outer_var; 从你的函数some_function ;
  2. 声明var outer_var; 上面那么你的function

在做完第一步之后应该是工作,而不是真的需要第二步。