【问题标题】:Retrieve variable from javascript object method callback从 javascript 对象方法回调中检索变量
【发布时间】:2012-03-06 13:53:07
【问题描述】:

在我的代码中,我需要调用一个对象方法,从其回调中检索数据,并将其传递给另一个方法或函数。

someObject.getSomeData({option1:'value1', option2:'value2'},
    function(data) {
        doAwesomeStuff(data);
    }
);

但是,回调无法识别其范围之外的任何函数/对象/变量。

我现在尝试做的是将所有内容包装在一个函数周围。

var myData = '';
(function(myData) {
    someObject.getSomeData({option1:'value1', option2:'value2'},
        function(data) {
            myData = data;
        }
    );
});
doAwesomeStuff(myData);

但这也不起作用。

有人知道如何正确地完成这个吗?

【问题讨论】:

  • 您所说的“超出其范围”指的是哪些变量?
  • > 但是,回调不能识别任何超出其范围的 > 函数/对象/变量。这听起来有点奇怪...... doAwesomeStuff() 定义在哪里?如果它在您的调用所在的范围内(或更广泛的范围内),则它必须是可访问的。
  • 它实际上已经定义并执行了,但这是在 nodejs 中,它正在做一些数据处理,虽然我有一个 console.out 语句来验证它是否被执行,但它似乎在其他中丢失了输出。好像我急着发这个问题,我是在学校做的,我一回到家就想通了,重新审视了一下。谢谢大家的帮助,我会把它标记为删除之类的:)

标签: javascript asynchronous callback


【解决方案1】:

你还没有真正给我们足够的继续下去,但是这个声明:

但是,回调无法识别其范围之外的任何函数/对象/变量。

...不正确。函数可以访问其定义范围内的所有内容,例如:

var a = 10;
function foo(b) {
    bar(5);
    function bar(c) {
        alert(a + b + c);
    }
}
foo(12); // alerts "27"

注意bar 不仅可以访问c,还可以访问b(来自对foo 的调用)和a(来自显示的最外层范围)。

因此,在您的示例中,您作为回调传入的匿名函数可以访问其定义范围内的所有内容; doAwesomeStuff 已在别处定义,大概可以访问不同的信息,因此您必须让回调将它需要的任何数据传递给它。

所以我猜你的代码看起来像这样:

function doAwesomeStuff(data) {
    // ...
}

function doSomethingNifty() {
    var a = 10,
        b = 20;
    someObject.getSomeData({option1:'value1', option2:'value2'},
        function(data) {
            doAwesomeStuff(data);
        }
    );
}

...并且您希望doAwesomeStuff 可以通过对doSomethingNifty 的调用访问ab。如果是这样,您唯一的选择是将它们作为参数传递给它(可能是最好的)或将它们导出到 doSomethingNiftydoAwesomeStuff 共享的某个范围的变量(可能不理想,太像全局变量)。

【讨论】:

  • 您是对的,但情况有所不同,感谢您的反馈!有关更多详细信息,请参阅上面对我自己的问题的评论
【解决方案2】:

您可以将bind所需的变量传递给异步方法的函数。

另外,this SO question 对这个话题有很好的处理。

您的第二个版本根本不起作用,因为您正试图立即访问尚不可用的数据(直到调用回调为止。)

【讨论】:

  • 你对回调是正确的,我能够弄清楚 :) 我的函数定义不明确,请参阅我对上面问题的评论
【解决方案3】:

你的第一种方法:

someObject.getSomeData({option1:'value1', option2:'value2'},
    function(data) {
        doAwesomeStuff(data);
    }
);

看起来不错。请提供更多关于不工作的细节。

一个问题可能是getSomeData() 实际上并没有调用回调函数。

doAwesomeStuff() 可以从接收到的数据中修改许多不同的变量。 doAwesomeStuff() 可以访问的变量是它在创建它的位置(在其范围中)可用的变量。

【讨论】:

  • 您是对的,但情况有所不同,感谢您的反馈!有关更多详细信息,请参阅上面对我自己的问题的评论
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 2011-10-22
  • 2011-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多