0

http://pastebin.com/x5UnA1sE

これは、問題のあるコードの一部の貼り付けです。

データをフォーマットし、必要な場所にこのデータを返すために、jQuery.get コールバック関数内でグローバル変数「データ」を操作しようとしています。

ただし、Ajax が非同期であるため、このグローバル変数はコールバック関数でまったく操作されません。

このコードで行おうとしているように、データベースから必要な情報を取得し、最終的にそれを変数に返すにはどうすればよいですか?

どんな方向でも大歓迎です!

ありがとう

4

4 に答える 4

1

私はあなたがポイントを逃したと思います、asynchroneusそしてcallback あなたは言葉を知っています、しかしあなたはこれらの行動をどのように扱うかを知りません。

asynchroneusは、コールバックを使用する必要があることを意味します-»は、コードが効率的でなければならないことを意味し、物事を次々に配置しないことを意味します。関数があり、これらの関数はすべて1つのことを実行し、意図したことを実行し終えたら、指定されたコールバックを呼び出します。

あなたがしなければならないことは、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
***/
于 2012-06-05T04:33:01.080 に答える
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"));

お役に立てれば。

于 2012-06-05T04:33:41.293 に答える
0

関数内で data 変数にアクセスするとどうなる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;
     });       
}
于 2012-06-05T04:12:08.233 に答える
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
}
于 2012-06-05T04:21:03.497 に答える