如何在ajax调用完成之前停止函数处理?

时间:2016-04-01 07:40:11

标签: javascript jquery ajax

看我有这样的代码

          function validate(){
            if (document.getElementById('<%=txtSeqNo.ClientId %>').value.trim() == "") {
                alert('Please enter Seuenceqnumer.');
                return false;
            }
            var result = checkduplicateseq();
            if (result) {
                return true;
            }
            else {
                return false;
            }           
        }

和checkduplicateseq的定义是

function checkduplicateseq() {
            var result = true;
            if ($('[id*=ctl00_CPHMainPageLambda_chkoperationlist] input[type="checkbox"]:checked').length > 0) {
                var seqNo = $("#ctl00_CPHMainPageLambda_txtSeqNo").val();
                var chkvalue = $('[id*=ctl00_CPHMainPageLambda_chkoperationlist] input[type="checkbox"]:checked').parent().parent().find("span").attr("datavalue");
                var hfmode = $("#ctl00_CPHMainPageLambda_hd_SequenceNo").val();
                var oldoperationid = $("#ctl00_CPHMainPageLambda_hd_operationo").val();
                if (seqNo == "") {
                }
                else {
                    $.ajax({
                        type: "POST",
                        url: "frmFAQMst.aspx/GetSequenceNoforOperation",
                        contentType: 'application/json; charset=utf-8',
                        dataType: 'json',
                        data: '{"OptionaId":"' + chkvalue + '","oldoperationid":"' + oldoperationid + '","seqNo":"' + seqNo + '","hfmode":"' + hfmode + '"}',
                        error: function (ex) {
                            console.log(ex);
                        },
                        success: function (response) {
                            if (response.d == "1") {

                                alert("Sequence Number already exist!");
                                $("#ctl00_CPHMainPageLambda_txtSeqNo").attr('value', '')
                                $("#ctl00_CPHMainPageLambda_txtSeqNo").focus();
                                result = false;
                            }
                            else {
                                result = true;
                            }
                        }
                    });
                }
            }
                return result;
        }

现在如果我最后从验证函数调用checkduplicateseq 并将checkduplicateseq fucntion的返回值存储在变量中,如

var result = checkduplicateseq();
在浏览器中我可以看到result = undefine

的值

所以它转到了该函数的其他部分

    if (result) {
        return true;
        }
   else {
           return false;
        }

并在其中返回false,因此进一步执行不起作用 我想在完成checkduplicateseq(ajax call)

之后再走得更远

3 个答案:

答案 0 :(得分:1)

  

在成功函数中使用回调。你可以将回调传递给checkduplicateseq函数,或者只是将它保留在全局命名空间中并直接从你的成功函数中调用它,或者你可以完全内联该函数(在成功函数中定义)

checkduplicateseq(someCallback);

function someCallback () {
    return !!result
}

和你的成功功能

success: function(response) {
    if (response.d == "1") {

        alert("Sequence Number already exist!");
        $("#ctl00_CPHMainPageLambda_txtSeqNo").attr('value', '')
        $("#ctl00_CPHMainPageLambda_txtSeqNo").focus();
        result = false;
    } else {
        result = true;
    }

    someCallback();
}

最好的方法,如果你链接很多回调,就是研究Promises,它允许你以顺序方式编写,而不是传递稍后要调用的东西

答案 1 :(得分:0)

您可以在$ .ajax()函数中添加async:false选项,这将导致进程等待。这通常被认为是不好的做法。

e.g。

$.ajax({
  async: false,
  type: "POST",
  url: "frmFAQMst.aspx/GetSequenceNoforOperation",
  contentType: 'application/json; charset=utf-8',
  dataType: 'json',
.... etc

答案 2 :(得分:0)

我正在检查这个问题,我刚刚在堆栈溢出中发现了类似的问题。请查看此链接

How to do sequential asynchronous ajax requests with given number of streams