从匿名javascript函数中获取变量

时间:2013-07-15 07:26:57

标签: 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 {
            var inner_var;
            // do stuff on **result** to build **inner_var**
            outer_var = inner_var;
        }
    });
    return outer_var;
}

如何将inner_var的值输出到some_function范围并返回?我在这里写的不起作用。

3 个答案:

答案 0 :(得分:6)

get调用是异步的,需要一些时间并稍后调用您的回调。但是,在调用get之后,您的脚本会继续执行并转到下一条指令。 所以这是发生的事情:

  • 你打电话给
  • 你返回outer_var(仍未定义) ......有时候...... ...
  • 获得结果并调用回调。
  • outer_var已设置

你不能让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)

  1. 从您的函数var outer_var;;
  2. 中删除some_function
  3. 声明var outer_var;上部然后是你的功能
  4. 在执行第1步后应该可以正常工作,而不是真的需要第2步。