42

目標: 私が求めているのは、データベースからデータを取得し、データベースに何かが追加されるたびに (draw_polygon でより明確に) main.php を更新することです (submit_to_db.php への $.ajax の後)。

したがって、基本的には、データベースに保存される配列を受け取るために ajax が別の php を呼び出す main.php があり、配列を返すために別の php を呼び出す json が main.php によって使用されます。

$(document).ready(function() {
    get_from_db();
    $('#button_cancel').click(function(){
       $.ajax({
          url: 'submit_to_db.php',
          type: 'POST',
          data: {list_item: selected_from_list},

          success: function(result){
             ...
             get_from_db();
          }
       });
    });
    function get_from_db(){
         $.getJSON('get_from_db.php', function(data) {
             ...
             draw_polygon(data);
         });
    }
 });

私の場合、私が行ったのは、実際にデータベースからデータを取得するget_from_dbための関数呼び出しであり、データは. しかし、それはどのように行われるべきですか?私はまったくの初心者で、正直言って ajax も試したのはこれが初めてです。だから私の質問:非同期は実際にどのように機能しますか? 関数を呼び出す代わりに、これに対する別の回避策はありますか (それは同期ではありませんか? 関数内にないときにページを更新しないのはそのためですか?) 常に - のように(ちなみに、私はそれを機能させることができませんでした)。私のアプローチは機能していますが、他にもっと良い方法があるのではないかと思いました。方法を学びたいです。前もって感謝します。私は何か意味があることを願っています。getJSONdraw_polygongetJSONget_from_dbgetJSON$.ajaxasync: false

より明確にするために、私が達成したいことは次のとおりです。

  1. @startページの、データベースからデータを取得します (現在は を介し​​てgetJSON)
  2. canvasを使用してペイントまたは描画します。data
  3. 完了ボタンをクリックすると、データベースが更新されます
  4. キャンバスの変更を再描画するために、自動的にデータを再度取得したいと考えています。
4

4 に答える 4

63

$.getJSON() は ajax 構成を使用するため、グローバルな ajax 構成を設定するだけです。

// Set the global configs to synchronous 
$.ajaxSetup({
    async: false
});

// Your $.getJSON() request is now synchronous...

// Set the global configs back to asynchronous 
$.ajaxSetup({
    async: true
});
于 2014-04-14T09:56:39.010 に答える
28

非同期とは、リクエストがバックグラウンドで実行されていることを意味し、応答を受け取ったときに関数を呼び出します。この方法は、結果を取得したいが、リクエスト内でアプリを使用できるようにする場合に最適です。直接的な応答が必要な場合は、同期要求を見てください。この要求は、応答を受け取るまでスクリプトの実行を一時停止し、ユーザーは応答を受け取るまで何もできません。次の方法で切り替えることができます。

async: false,

たとえば、次のようになります。

$.ajax({
    url: "myurl",
    async: false,
    ...
})
于 2012-10-22T10:48:51.140 に答える
20

$.getJSON() は、ドキュメントで言うように、構成を受け入れません:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

したがって、その点でリクエストを書き直すだけで、async:falseは期待どおりに機能します。

于 2013-05-13T16:37:37.997 に答える
14

$.getJSON()$.ajax()は、同期するように構成できる簡略表記です( jQuery.getJSONおよびJQuery.ajaxを参照)。

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  async: false, 
  success: function(data) {
      ...
      draw_polygon(data);
  }
});

ただし、同期呼び出しは避けてください。jQuery docからの引用(async prop を参照) :

クロスドメイン リクエストと dataType: "jsonp" リクエストは、同期操作をサポートしていません。同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はすべてのアクションを無効にする場合があることに注意してください。

次のようなjQuery Deferredsを試してみてください:

var jqxhr = $.getJSON(url);
jqxhr.done(function(data) {
    ...
    draw_polygon(data);
});
于 2015-02-23T15:19:11.487 に答える