从匿名javascript函数中获取变量
我正在使用一个匿名函数对使用Restler的从匿名javascript函数中获取变量,javascript,node.js,Javascript,Node.js,我正在使用一个匿名函数对使用Restler的get函数返回的html执行一些工作: var some_function() { var outer_var; rest.get(url).on('complete', function(result, response) { if (result instanceof Error) { sys.puts('Error: ' + result.message); } else {
get
函数返回的html执行一些工作:
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;
}
如何将internal\u var
的值输出到some\u函数
范围并返回它?我在这里写的东西不起作用
var外部变量\u var代码>从您的函数某些函数李>
声明var外部变量代码>上限然后是您的函数
在执行步骤1之后,它应该可以工作,而不是真正需要步骤2。与node的大多数模块一样,Restler也是一个具有异步调用的基于事件的库。因此,当您返回外部变量时
不一定调用complete
回调(对于某些库,如果缓存了结果,则可能会调用回调,但您应该始终期望它被称为异步回调)
如果添加一些日志记录,则可以看到此行为:
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;
}
var some_函数(){
外部变量;
console.log(“注册回调之前”);//get调用是异步的,需要一些时间,稍后再调用回调。但是,调用get后,脚本将继续执行并转到下一条指令。
下面是发生的情况:
- 你打电话给我
- 返回外部变量(该变量仍未定义)
……有时以后
- get result已到达并调用回调
- 设置外部变量
您不能让some_函数为异步的内容返回值,因此您必须使用回调函数,并让代码在处理数据后调用它
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);
}
});
}
问题是因为调用complete
回调get
是异步的。谢谢,回调就是这样做的。不过我确实有一个问题。on('complete',函数(…应该负责调用的异步性质,对吗?在get调用完成之前,该函数中的代码不应该执行。我是否仍然能够以某种方式将数据从函数处理程序传递回外部上下文?当您声明的回调为“complete”时,您创建一个闭包:函数被创建,其作用域包含上面声明的所有内容。因此,是的,回调可以通过这种方式将数据传递到外部。您一定要尝试在调试器中一步一步地执行代码,以便了解调用函数的顺序,以及每个函数可访问的作用域。这将使事情比这个解释更清楚:)