2014-09-01 21 views
-1

我想从一个名为load.php的php文件发送一个整数数组到一个JS脚本,该脚本又将其发送到一个用js编写的Processing文件。发送一个解析数组进行处理

在我创建我想发送和使用JSON发送阵列的load.php(所述阵列由至少40的整数):

echo json_encode($varsArray); 

在名为game.php是主PHP文件该脚本:

<script language="JavaScript" type="text/javascript"> 
function js_GetArray() { 
    $.get("load.php", function(actiondata) { 
     var obj = JSON.parse(actiondata); 
     return obj; 
    }); 
} 

使用此脚本请求从load.php阵列(我接收JSON格式),接收I解析它并将其发送回给处理文件之后。

在处理文件,我收到数组作为这样的:

var objArr; 
void setup(){ 
    objArr = js_GetArray(); 

} 
void draw() { 
    alert(objArr[1]); 
} 

当激活警报我收到错误:

Uncaught TypeError: Cannot read property '1' of undefined

我该如何解决这一点,有没有更好的办法发送数组?

谢谢。

+0

@ClémentMalet那部分手动写入前断绝了所有的其他代码之后,它在代码本身正确写入且不论将差错。 – 2014-09-01 15:17:59

+0

问题在于'$ .get'是异步的,所以它不能让'js_GetArray'返回'obj',因为你构建'obj'的回调函数稍后会被执行。 – Oriol 2014-09-01 15:19:05

+0

可能重复的[如何从Ajax调用返回响应?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – Oriol 2014-09-01 15:25:23

回答

-1

你的问题是双重的。

  1. 您的js_GetArray函数实际上并未返回您的数据。 你实际上是从传递给$.get回调返回数据,而不是从js_GetArray功能

  2. 异步执行将会给你带来的问题。这就是JavaScript中常见的情况,就是你传递了一个回调函数,这个回调函数在给定的过程完成后稍后调用。 $.get必须向网络服务器发出请求并返回内容。这不可能立即发生,因此javascript 会在完成后致电并显示结果。

因此,直到$.get调用回调,您才会获取数据。

你需要做的是这样的:

var objArr; 

function js_GetArray(callback) { 
    $.get("load.php", function(actiondata) { 
     var obj = JSON.parse(actiondata); 
     callback(obj); 
    }); 
} 

void setup(){ 
    js_GetArray(function(data) { 
     objArray = data; 
    }); 
} 
void draw() { 
    alert(objArr[1]); 
} 

你可能想了解代码是如何工作的异步JavaScript中。 这里有一个文章:

http://recurial.com/programming/understanding-callback-functions-in-javascript/

+0

没有评论解释downvote?评论帮助我们改进答案。 – 2014-09-01 17:58:13

1

你几乎没有。 AJAX的意思是“ASYNCHRONOUS Javascript和XML”。也就是说,您的draw函数在ajax调用仍在进行时执行。因此,objArr仍然是空的。

认沽认购到draw回调:

<script language="JavaScript" type="text/javascript"> 
function js_GetArray() { 
    $.get("load.php", function(actiondata) { 
     var obj = JSON.parse(actiondata); 
     // return obj; doesn't work! 
     draw (obj); 
    }); 
} 

void draw(objArr) { 
    alert(objArr[1]); 
} 
+0

使用回调方法设法将数组发送到处理,但就像您所说的那样,它仍然会经过一个未定义的绘制循环。 - 我可能误解了你的意思,但是将回调添加到回调中实际上会导致我每次都收到未定义的回复。 – 2014-09-01 16:17:07

+0

很好解释。但是,我认为'draw'是通过处理调用的,所以这不起作用。 – 2014-09-01 18:15:00

相关问题