0

私はいくつかのネストされた ajax 呼び出しを持つ jQuery 関数を持っています:

function ulozitKlienta () {
  //some code
        if (!confirm("Není vyplněno datum vstupu klienta!\n\nPřesto uložit?")) return false;
  $.ajax({
    type    : "POST",
    cache    : false,
    url      : "ajax/ulozit_klienta.php",
    data    : JSON.stringify(out),
    dataType:  "json",
    success  : function (data) {
      if (data.vysledek == "chyba") {
        //some code
        return false;  // TODO ajax return
      } else {
        if (out["akce"] == "pridat") {
          if (data.vysledek == "duplikat") {
            $("#js-d-duplikat").dialog({
              modal    : true,
              buttons  : {
                "Přesto vytvořit nového"  :  function () {
                  out["opravdu"] = true;
                  $.ajax({
                    type    : "POST",
                    cache    : false,
                    url      : "ajax/ulozit_klienta.php",
                    data    : JSON.stringify(out),
                    dataType:  "json",
                    success  : function (data) {
                      if (data.vysledek == "chyba") {
                        //some code
                        return false;  // TODO ajax return
                      } else //some code
                    },
                    error    :  function (data, status, e) {
                      //some code
                      return false;  // TODO ajax return
                    }
                  });
                }
              }
            });
          } else //some code
        } else //some code
      }
    },
    error    :  function (data, status, e) {
      //some code
      return false;  // TODO ajax return
    }
  });
}

他の2つの異なるポイントから呼び出すため、機能しています。

$("#add_tab").on("click", function() {  // založí nový protokol a vytvoří mu tab
  if (!ulozitKlienta()) return false;
  //some code
});

$("#menu_local").on("click", "[name='ulozit_klienta']", function() {
  ulozitKlienta();
});

私の問題は、関数 ulozitKlienta が ajax 呼び出しの終了を待っておらず、未定義を返していることです。https://stackoverflow.com/a/11283748/836697に示されているように、Promise インターフェイスを使用していると思いましたが、方法がわかりません。

4

2 に答える 2

0

ulozitKlienta がすべての非同期コードを終了した後に何らかのコードを実行したい場合は、これを試してください: 関数ヘッダーを変更し、ajax コールバックの最後でコールバックを呼び出します。このようにして、ajax-call が終了したときに何が起こるべきかを定義できます。

function ulozitKlienta (successCallback, errorCallback) {
//some code
    if (!confirm("Není vyplněno datum vstupu klienta!\n\nPřesto uložit?")) return         false;
   $.ajax({
type    : "POST",
cache    : false,
url      : "ajax/ulozit_klienta.php",
data    : JSON.stringify(out),
dataType:  "json",
success  : function (data) {
  if (data.vysledek == "chyba") {
    //some code
    return false;  // TODO ajax return
  } else {
    if (out["akce"] == "pridat") {
      if (data.vysledek == "duplikat") {
        $("#js-d-duplikat").dialog({
          modal    : true,
          buttons  : {
            "Přesto vytvořit nového"  :  function () {
              out["opravdu"] = true;
              $.ajax({
                type    : "POST",
                cache    : false,
                url      : "ajax/ulozit_klienta.php",
                data    : JSON.stringify(out),
                dataType:  "json",
                success  : function (data) {
                  if (data.vysledek == "chyba") {
                    //some code
                    return false;  // TODO ajax return
                  } else //some code
                },
                error    :  function (data, status, e) {
                  //some code
                  return false;  // TODO ajax return
                }
              });
            }
          }
        });
      } else //some code
    } else //some code
  }
successCallback();
},
error    :  function (data, status, e) {
  errorCallback();
  //some code
  return false;  // TODO ajax return
}
});
 }

最後に 1 つのアドバイス: 英語でコーディングしてコメントするようにしてください。コード作成者自身ではない方が簡単です ;-)

于 2013-07-23T12:57:25.167 に答える
0

関数はreturnからの約束をする必要があり$.ajax()ます。

その後のすべての処理が、.doneその promise にアタッチされたコールバック内から開始されるようにする必要があります。

returnまた、jQuery ダイアログ ボタンのコールバック関数から値を取得することもできません。あなたができることは、ボタンが押されたときにpromiseできる自分で作った a を返すことです。.resolve

このコードをクリーンアップするには、実際には 3 つの関数が必要で、そのすべてが を返す必要がありますpromise

  • 2 つの AJAX 呼び出しのそれぞれに 1 つ
  • ダイアログボックス用

次に、これらの 3 つの関数を次のように連結します

firstAjaxCall().then(function(data) {
    // test data - you can return `false` here if desired
    ...

    return showDialog().then(secondAjaxCall);
}).done(function() {
    // continue processing here
});
于 2013-07-23T12:58:25.780 に答える