2

我正在使用匿名函数对使用 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_varout 的值获取到some_function范围并返回它?我在这里写的不起作用。

4

3 回答 3

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);
        }
    });
}
于 2013-07-15T07:39:09.943 回答
2

像 node 的大多数模块一样,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;
}

所以如果你想用这个值做一些事情,你需要在你的完整回调中调用应该用这个值做一些事情的函数。

于 2013-07-15T07:39:01.977 回答
-3
  1. var outer_var;从您的功能中删除some_function;
  2. 声明var outer_var;上层然后你的函数

完成第 1 步后它应该可以工作,而不需要第 2 步。

于 2013-07-15T07:34:15.897 回答