从javascript对象方法回调中检索变量

时间:2012-03-06 13:53:08

标签: javascript asynchronous callback

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

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

然而,这也不起作用。

有人知道如何正确地完成这项工作吗?

3 个答案:

答案 0 :(得分:3)

你还没有真正给我们足够的信息,但是这句话:

  

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

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

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能够通过a的来电访问bdoSomethingNifty。如果是这样,你唯一的选择是将它们作为参数传递给它(可能是最好的),或者将它们导出到doSomethingNiftydoAwesomeStuff共享的某些范围的变量(可能不太理想,太像globals)。 / p>

答案 1 :(得分:1)

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

此外,this SO question对该主题有很好的处理。

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

答案 2 :(得分:1)

你的第一种方法:

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

看起来很好。请提供更多有关不起作用的详细信息。

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

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