从匿名的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;
complete
callback不一定是被调用的(对于一些库,如果结果被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。
- 删除
var outer_var;
从你的函数some_function
; - 声明
var outer_var;
上面那么你的function
在做完第一步之后应该是工作,而不是真的需要第二步。