简体   繁体   English

从匿名javascript函数中获取变量

[英]Get variable out of anonymous javascript function

I'm using an anonymous function to perform some work on the html I get back using Restler's get 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;
}

How can I get the value of inner_var out to the some_function scope and return it? 如何将inner_var的值获取到some_function范围并将其返回? What I have written here doesn't work. 我在这里写的东西行不通。

The get call is asynchronous, it will take some time and call your callback later. get调用是异步的,需要一些时间,稍后再调用您的回调。 However, after calling get, your script keeps executing and goes to the next instruction. 但是,在调用get之后,脚本将继续执行并转到下一条指令。 So here is what happens: 所以这是发生了什么:

  • you call get 你打电话给
  • you return outer_var (which is still undefined) ... sometimes later ... 您返回external_var(仍未定义)...有时稍后...
  • get result has arrived and the callback is called. 获取结果已到达,并调用了回调。
  • outer_var is set 设置了external_var

You can't have your some_function return a value for something that is asynchronous, so you will have to use a callback instead and let your code call it once data is processed. 您不能让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);
        }
    });
}

Like most of the modules of node, Restler is also a event based library having async calls. 像节点的大多数模块一样,Restler还是基于事件的具有异步调用的库。 So at the time you do return outer_var; 因此,此时您确实return outer_var; the complete callback was not necessarily called (With some libraries it could be if it the result was cached, but you should always expect that it is called asynchronous). complete回调不一定被调用(对于某些库,如果结果被缓存,则可能是这样,但是您应该始终期望将其称为异步)。

You can see this behavior if you add some logging: 如果添加一些日志记录,则可以看到此行为:

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;
}

So if you would like to do something with this value you would need to call the function that should do something with this value out of your complete callback. 因此,如果您想使用此值做某事,则需要从完整的回调函数中调用应该使用该值做某事的函数。

  1. Remove the var outer_var; 删除var outer_var; from your function some_function ; 从您的功能some_function ;
  2. Declare the var outer_var; 声明var outer_var; upper then your function 上层然后你的功能

It should be work after you did step 1, not really need step 2. 完成步骤1之后,应该就可以工作了,而实际上并不需要步骤2。

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

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