我正在使用匿名函数对我使用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 {
var inner_var;
// do stuff on **result** to build **inner_var**
outer_var = inner_var;
}
});
return outer_var;
}
如何将inner_var
的值输出到some_function
范围并返回?我在这里写的不起作用。
答案 0 :(得分:6)
get调用是异步的,需要一些时间并稍后调用您的回调。但是,在调用get之后,您的脚本会继续执行并转到下一条指令。 所以这是发生的事情:
你不能让some_function为异步的东西返回一个值,所以你必须使用一个回调代码,让你的代码在处理完数据后调用它。
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);
}
});
}
答案 1 :(得分:2)
与大多数节点模块一样,Restler也是一个基于事件的库,具有异步调用。所以当你执行return outer_var;
时,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;
}
因此,如果您想对此值执行某些操作,则需要调用应该使用此值完成回调的函数。
答案 2 :(得分:-3)
var outer_var;
; some_function
var outer_var;
上部然后是你的功能在执行第1步后应该可以正常工作,而不是真的需要第2步。