Ajax调用不会在完成的promise中分配值

时间:2015-06-01 10:24:30

标签: javascript jquery ajax

我有这样的方法:

var isNameUnique = false;

function ValidateName() {

        var url = "/SomeRules/CheckIfNameExists/";

        var request = $.ajax({
            url: url,
            method: "GET",
            data: { sName: name},
            dataType: "JSON"
        });
        request.done(function (result) {
            if (result.doesNameExists) {
                alert("Name Already Exists!");
                console.log("Name Already Exists!");
            }
            else {
                isNameUnique = true;
                console.log("Name is unique!");
            }

        });

        request.fail(function (jqXHR, textStatus) {
            console.log(textStatus);
            alert("Request failed.");
        });

    console.log("Exiting ValidateName()");
}

这就是这样称呼的:

function CreateNewUser() {
    ValidateName();
    console.log(isNameUnique);
    if(isNameUnique){
     // do stuff
    }
}

当我运行应用程序时,我按顺序在控制台中有这些:

  1. 退出ValidateName()
  2. 名字是唯一的!
  3. 当它打印第三个控制台时,我希望'isNameUnique'设置为true。 但那并没有发生! 我做错了什么?

    提前致谢。

2 个答案:

答案 0 :(得分:0)

默认情况下,每个Ajax请求都是异步的,意味着Ajax调用旁边的代码不会等待Ajax调用的完成。 所以你需要做的是,使你的Ajax调用同步,以便下一行代码只在完成ajax调用后执行。

要使ajax调用同步,请在ajax设置中添加以下选项:

async : false

有关详细信息,请查看this文档并阅读有关异步设置的信息。

答案 1 :(得分:0)

当您开始使用异步时会发生这种情况。您的变量isNameUnique会在您拨打console.log(isNameUnique);后很长时间内分配值。解决这个问题的最好方法是让函数ValidateName在其上返回一个promise和chain。