从匿名的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
在做完第一步之后应该是工作,而不是真的需要第二步。
- 随机获取ECONNREFUSED错误
- 使用Socket.IO通过HTTP / GET发送数据
- 我如何实现打孔Autoprefixer预处理器?
- 在node.js中使用mysql-node查询中的variables
- Node.JS不附加string怪异的错误?
- Netscape Enterprise Server和服务器端JavaScript(SSJS)与Node.js
- require('file.json')vs readFile('/ file.json',callback)vs readFileSync('/ file.json','utf-8')
- 上传分块的图像文件问题
- 将PDF从Amazon S3中拉出并从缓冲区/stream中直接在浏览器中呈现