需要操纵全局var,但不能在Ajax中操作。需要解决这个问题

时间:2012-06-05 04:08:42

标签: javascript jquery

http://pastebin.com/x5UnA1sE

这是我的一些麻烦编码的粘贴。

我正在尝试在jQuery.get回调函数中操作全局变量“data”,以便格式化数据并将数据返回到需要的位置。

但是,在回调函数中根本不会操纵此全局变量,这很可能是由于Ajax是异步的。

我如何从数据库中获取所需的信息,并最终将其返回到变量中,正如我在此代码中尝试做的那样?

任何方向都会非常感激!

由于

4 个答案:

答案 0 :(得分:1)

我认为你错过了积分asynchroneuscallback 你知道这些话,但你不知道如何处理这些行为。

asynchroneus意味着你必须使用回调 - »意味着你的代码必须是有效的,你不要把它们放在其他代码之后。你有函数,所有这些函数都做一件事,并在完成它们的目的时调用指定的回调。

您需要做的是不要期望从mapPoints返回,而是在完成操作数据时调用callback函数。

使用回调的一个小例子

function displayPoint(data) {
    //display all the points
}

function callServer(callback {
    ajaxCall(url, function(data) { dataHandler(data, callback); } );
}

function dataHandler(data, callback) {
    // modify data

    callback(data);
}


// process
callServer(displayPoint); 

/***
call callServer by passing displayPoint as callback
callServer will perform the ajax call.
The result will be handle by the anonymus function.
This function just call the dataHandler function, passing it the datas from the server, and the callback function given to callServer ( so displayPoint )
dataHandler will modify the datas, then call the callback function, passing it the datas.

YOU DON'T NEED GLOBAL VAR ANYMORE, and that is a really good thing
***/

答案 1 :(得分:0)

如果您访问callback函数中的数据变量怎么办?

function mapPoints()
{
    var url = '../common/ajax/get_map_points.php'; 
    var map = {}; 
     $.get( url, map, recieve_map_points,function(data){
          console.log(data);         
          return data;
     });       
}

答案 2 :(得分:0)

如果你做那样的事情会更好

function mapPoints() {
    var url = '../common/ajax/get_map_points.php'; 
        map = {}; 

     $.get( url, map, recieve_map_points,function(data){
         getMyData(data);  // call function when you receive data
     });       
}

function getMyData(data) {
  // make something with data
}

答案 3 :(得分:0)

我将详细说明Shyju所说的内容。

首先,ajax是否异步不是问题。您始终可以使用asynch: false并具有同步请求来禁用它。

这里的问题是您希望如何访问和操作返回给服务器的数据。这是关键部分。

让我们分解在何处进行更改

$.get( url, map, receive_map_points){});

在上面的回调必须使用函数声明来访问,你不能用你为自己做的另一个函数替换这个声明,而是你可以命名对象,并将它传递给另一个函数以保持数据内部操纵对象。这里的关键要素是我们需要确保send the object back as a JSON encoded array

jQuery.get( url, map, function(data){
  //access the data as a json object, extract what we need
  var ddoc = data.doc;
  var dtextrank = data.textrank;

  //pass the newly created data to our function, and have the function extract what it needs.
  receive_map_points(ddoc, dtextrank);
});

function receive_map_points(doc, textrank){
  //same code you used originally.
}

正如您在上面所看到的,我们不需要更改receive_map_points函数中的任何代码,但我们确实需要更改data being sent back to the function as a JSON encoded array,例如在php中跟随:

json_encode(array("doc" => "something", "textrank" => "something else"));

希望这有帮助。