繁体   English   中英

从匿名javascript函数中获取变量

[英]Get variable out of anonymous javascript function

我正在使用匿名函数对使用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范围并将其返回? 我在这里写的东西行不通。

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

  • 你打电话给
  • 您返回external_var(仍未定义)...有时稍后...
  • 获取结果已到达,并调用了回调。
  • 设置了external_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);
        }
    });
}

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

因此,如果您想使用此值做某事,则需要从完整的回调函数中调用应该使用该值做某事的函数。

  1. 删除var outer_var; 从您的功能some_function ;
  2. 声明var outer_var; 上层然后你的功能

完成步骤1之后,应该就可以工作了,而实际上并不需要步骤2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM