我是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称为全局数组,以便在需要时使用其值。
任何帮助将不胜感激
感谢
Ĵ
答案 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
希望这应该有用。