【问题标题】:how to make jquery wait for return ajax in function如何让jquery在函数中等待返回ajax
【发布时间】:2013-07-22 13:12:13
【问题描述】:

我有一个带有多个嵌套 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
    }
  });
}

我有它的功能,因为我从其他地方的两个不同点调用它:

$("#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 调用结束并且返回未定义。我以为我使用了这里显示的 Promise 接口https://stackoverflow.com/a/11283748/836697,但我真的不知道如何。

【问题讨论】:

  • 我不能使用任何提供的答案。 async:false 是不可能的。并且如图所示使用回调或承诺不适合我的情况。我需要定义,而不是立即使用该函数一次,并在恰好位于.on() 中的代码中的两个不同点使用它,因此它们是基于交互调用的。我坚信承诺是正确的方式,我只是不知道如何。

标签: jquery ajax promise


【解决方案1】:

如果你想在 ulozitKlienta 完成所有异步代码后执行一些代码,试试这个: 更改您的函数头并在 ajax 回调结束时调用回调。通过这种方式,您可以定义 ajax 调用完成时应该发生的情况。

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
}
});
 }

最后一个建议:尝试用英文编码和评论,如果不是编码员本身,则更容易完成;-)

【讨论】:

  • 好的,毕竟回调是这样的。
【解决方案2】:

你的函数应该return来自$.ajax()的承诺。

然后,您必须确保所有后续处理都是从附加到该承诺的 .done 回调中开始的。

你也不能return jQuery 对话框按钮回调函数中的值。你可以做的是返回一个你自己制作的promise,当按下按钮时你可以.resolve

要清理这段代码,您实际上需要三个函数,所有这些函数都应该返回一个promise

  • 两个 AJAX 调用各调用一个
  • 一个用于对话框

然后用 something 将这三个函数链接在一起,如下所示:

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

    return showDialog().then(secondAjaxCall);
}).done(function() {
    // continue processing here
});

【讨论】:

  • 感谢您的建议,但我对承诺还很陌生,尽管我相信这是正确的做法 - 我不知道如何将它应用到我的案例中。我需要定义,而不是立即使用该函数一次,并在恰好位于 .on() 中的代码中的两个不同点使用它,因此它们是基于交互调用的。我认为您的建议会立即被调用。你能根据我的情况修改一下吗?
  • @meridius 我展示的代码可能在.on 处理程序中。
  • 嗯,这就是我的观点。如果我在一个 .on() 处理程序中声明它,我将不得不在另一个处理程序中重新声明它,这就是我想要避免的。
猜你喜欢
  • 2010-10-19
  • 2012-07-02
  • 2012-07-08
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2015-07-17
相关资源
最近更新 更多