在函数中抓取变量

时间:2015-08-22 16:17:50

标签: jquery

我是jQuery的新手,我正在通过构建我的第一个DYI Web界面项目来学习。

这是使用以下代码的一部分:

import java.awt.Dimension;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyCtrl3 extends JFrame {

private class MyDispatcher implements KeyEventDispatcher {
    // usualy one prefer using keybindings - but we are in
    // special case for detect AltGr
    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
            if (e.isAltGraphDown()) {
                // uncaught in windows
                System.out.println("ALT GRAPH");
            } else if (e.isControlDown()) {
                // fired 1 by windows when press AltGr
                System.out.println("CONTROL");
                // here I launch a timer, 1ms delay is enough 
                // to wait for ALT key if coming
            } else if (e.isAltDown()) {
                // fired 2 by windows when press AltGr
                // here I unarm the timer
                System.out.println("ALT");
            }
        } else if (e.getID() == KeyEvent.KEY_RELEASED) {
            if (e.getKeyCode() == KeyEvent.VK_ALT_GRAPH) {
                System.out.println("ALT GRAPH released");
            } else if (e.getKeyCode() == KeyEvent.VK_ALT) {
                System.out.println("ALT released");
            } else if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
                System.out.println("CONTROL released");
            }
        }
        return false;
    }
}

public MyCtrl3() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setPreferredSize(new Dimension(200, 100));
    KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    manager.addKeyEventDispatcher(new MyDispatcher());
}

public static void main(String[] a) {
    MyCtrl3 myProjet = new MyCtrl3();
    myProjet.pack();
    myProjet.setVisible(true);
}
}

我希望能够将lights_array称为全局数组,以便在需要时使用其值。

任何帮助将不胜感激

感谢

Ĵ

3 个答案:

答案 0 :(得分:1)

正如其他答案和评论所指出的那样,$.getJSON()是异步的。该函数立即返回,服务器响应JSON数据之前。代码底部的lights_array引用在您收到并处理回调内的数据之前运行。

所以你应该做的第一件事是将lights_array 的声明移到回调中,而不是在$.getJSON()调用之前。通过这种方式,您无法在回调之外尝试访问它。如果要在代码中的其他位置使用此数据,可以编写一个函数并从回调中调用该函数,并将该数组作为参数传递。

cs1193&#39的答案说你需要使用promises($.when()then()方法)。这是不正确的。 Promise只是组织回调函数的好方法。您肯定应该了解它们,并且可能希望在您的代码中使用它们,但您不能 使用它们。普通的回调同样有效。您在此处遇到的问题是尝试使用异步回调之外的数据,而不是通过承诺是否达到回调,还是直接传递到$.getJSON()调用。如果您使用了承诺,then()是错误的使用方法;你想要的是done()

代码中还有一些冗余的未使用变量。这可能只是你正在进行的测试遗留下来的,但它是你想要清理的东西。

我建议您使用$.map()生成lights_array而不是for循环。它更简单,更容易阅读。

由于您不熟悉JavaScript,我还会就命名约定提出一些建议。

首先是一个小问题,但names_with_underscores在JavaScript中并不是真正的惯用语。更常见的约定是变量,方法和普通函数的camelCaseNames,以及构造函数的PascalCaseNames(首字母大写)。

还要注意单数与复数名称。您有(未使用的)单数名称lights_obj,它是设备的数组(它与verajson.devices相同)。复数名称lights_ids指的是单个设备对象。它不是复数,也不是id,它是包含id的对象。

将所有这些放在一起,代码可能如下所示:

$.getJSON( "resources/php/getjson.php", function( data ) {
    var lights = $.map( data.devices, function( device ) {
        return device.id;
    });
    console.log( lights[9] );
    someFunction( lights );  // to use the lights array elsewhere
});

如果您想尝试使用承诺,请注意$.getJSON 返回承诺。没有必要将其包含在$.when()电话中。你可以这样做:

$.getJSON( "resources/php/getjson.php" )
    .done( function( data ) {
        var lights = $.map( data.devices, function( device ) {
            return device.id;
        });
        console.log( lights[9] );
        someFunction( lights );  // to use the lights array elsewhere
    });

答案 1 :(得分:0)

getJson是一个异步方法,因此当您到达代码的外部部分时,该数组可能尚未填充。如果要对数组执行某些操作,则应将逻辑放在getJson方法的完成回调中。

答案 2 :(得分:0)

查看代码的问题是它是异步工​​作的,其中lights_array[9]将首先执行getPost方法,因此它将保持很大程度上未定义,因为它不知道{{1}中的内容索引尽管声明了数组。您必须使用promises 9$.when来分配和访问数据。

then

希望这应该有用。