Javascript呈现。如何编写Javascript,使其不会';在函数调用结束之前,不要继续执行代码

Javascript呈现。如何编写Javascript,使其不会';在函数调用结束之前,不要继续执行代码,javascript,Javascript,不确定我的问题是否主观/客观,但作为一名JavaScript新手,我经常遇到这个问题。我来了 我习惯于编写C,所以我的JavaScript结构看起来像C。就这样,我想这会带来问题;-) 让我们举一个我今天再次遇到问题的简单例子: MyLibrary.fn.InitAddEntityForm = function () { $('a#btnAddEntity').click(function () { //post data and receive object w

不确定我的问题是否主观/客观,但作为一名JavaScript新手,我经常遇到这个问题。我来了

我习惯于编写C,所以我的JavaScript结构看起来像C。就这样,我想这会带来问题;-) 让我们举一个我今天再次遇到问题的简单例子:

MyLibrary.fn.InitAddEntityForm = function () {
    $('a#btnAddEntity').click(function () {
            //post data and receive object with guid and isPersisted boolean
            var persistedObject = MyLibrary.fn.CheckAndSendAddEntityForm("name", "avatarurl.png");
            console.log("test");

            //check if persisted and go to next step
            if (persistedObject.isPersisted) {
                MyLibrary.fn.InitAddAnotherEntityForm(persistedObject.gdEntityId);
            } else {
                alert("Oops, something went wrong. Please call 911");
            }
    });
};


//////*****/////
//SOME FUNCTION THAT SENDS MY FORM AND RETURNS AN OBJECT WITH TRUE VALUE AND POSTED ENTITY ID
/////*****//////
MyLibrary.fn.CheckAndSendAddForm = function (txtName, ImageUrl) {
var postUrl = "/admin/add";
var persistedObject = new Object();
$.post(
    postUrl,
    { Name: txtName, ImageUrl: txtImageUrl},
    function (data) {
        if (data.Status == 200) {
            console.log("Post status:" + data.Message);
            persistedObject.isPersisted = true;
            persistedObject.gdEntityId = data.Data;
        } else if (data.Status == 500) {
            console.log("Failed to post entitiy");
        } else {
            console.log("Fault with Javascript");
        }
    }, "json"
);
return persistedObject;
})

好了,就这样。一切看起来都很好,对吗?浏览器说不。 我试着用firebug调试它,一行一行地在我的代码上循环,这样浏览器就完成了我想要的:执行一个新函数以显示向导中的下一个面板

在我的代码中放置了大量Console.logs()之后,我发现这一定是JavaScript中的计时问题。在C#中,代码逐行执行,但显然JavaScript不执行。 通过放置Console.log(“test”),我注意到在我的控制台中,“test”出现在“Post status:Success!”之前

因此,我的问题是,我应该如何编写JavaScript代码,以便控制浏览器执行代码的方式? 我真的应该将下面的代码替换到CheckAndSendAddEntityForm()的末尾吗


我必须这样写JavaScript:一个巨大的多米诺骨牌效应,还是我只是做错了什么

$.post是AJAX调用的快捷方式,根据定义,AJAX是异步的,这意味着它在继续处理之前不会等待响应。如果将其切换为常规的AJAX()方法,则可以将一个异步选项设置为false,这将使其按照预期的方式运行


或者,您也可以定义一个函数,以便在成功返回AJAX请求时执行,在该函数中,您可以调用流程链中的下一步。

$。post是AJAX调用的快捷方式,根据定义,AJAX是异步的,这意味着在继续处理之前不会等待响应。如果将其切换为常规的AJAX()方法,则可以将一个异步选项设置为false,这将使其按照预期的方式运行


或者,您还可以定义一个函数,以便在成功返回AJAX请求时执行,在该函数中,您可以调用流程链中的下一步。

JavaScript是单线程的。如果您具有异步功能,那么一个简单的布尔变量将有助于在某些进程运行时不允许调用函数


如果您想一个接一个地执行异步任务(如domino线路),则需要使用回调函数。

JavaScript是单线程的。如果您具有异步功能,那么一个简单的布尔变量将有助于在某些进程运行时不允许调用函数


如果您想一个接一个地执行异步任务(如domino线路),则需要使用回调函数;这意味着回调方法通过
$公开。请求完成时将执行post
,但对
$.post
的调用完成后,javascript将继续执行。如果要在ajax调用完成后执行某些操作,则需要提供回调方法并执行其他操作,例如:

MyLibrary.fn.CheckAndSendAddForm = function (txtName, ImageUrl, callback) {
var postUrl = "/admin/add";
var persistedObject = new Object();

$.post(
    postUrl,
    { Name: txtName, ImageUrl: txtImageUrl},
    function (data) {
        if (data.Status == 200) {
            console.log("Post status:" + data.Message);
            persistedObject.isPersisted = true;
            persistedObject.gdEntityId = data.Data;
        } else if (data.Status == 500) {
            console.log("Failed to post entitiy");
        } else {
            console.log("Fault with Javascript");
        }

        callback(); // This is where you return flow to your caller
    }, "json"
);
};
然后你这样调用:

var persistedObject = MyLibrary.fn.CheckAndSendAddEntityForm("name", "avatarurl.png", function()
{
        console.log("test");

        //check if persisted and go to next step
        if (persistedObject.isPersisted) {
            MyLibrary.fn.InitAddAnotherEntityForm(persistedObject .gdPronoId);
        } else {
            alert("Oops, something went wrong. Please call 911");
        }
});

AJAX调用是不同步的;这意味着回调方法通过
$公开。请求完成时将执行post
,但对
$.post
的调用完成后,javascript将继续执行。如果要在ajax调用完成后执行某些操作,则需要提供回调方法并执行其他操作,例如:

MyLibrary.fn.CheckAndSendAddForm = function (txtName, ImageUrl, callback) {
var postUrl = "/admin/add";
var persistedObject = new Object();

$.post(
    postUrl,
    { Name: txtName, ImageUrl: txtImageUrl},
    function (data) {
        if (data.Status == 200) {
            console.log("Post status:" + data.Message);
            persistedObject.isPersisted = true;
            persistedObject.gdEntityId = data.Data;
        } else if (data.Status == 500) {
            console.log("Failed to post entitiy");
        } else {
            console.log("Fault with Javascript");
        }

        callback(); // This is where you return flow to your caller
    }, "json"
);
};
然后你这样调用:

var persistedObject = MyLibrary.fn.CheckAndSendAddEntityForm("name", "avatarurl.png", function()
{
        console.log("test");

        //check if persisted and go to next step
        if (persistedObject.isPersisted) {
            MyLibrary.fn.InitAddAnotherEntityForm(persistedObject .gdPronoId);
        } else {
            alert("Oops, something went wrong. Please call 911");
        }
});

您遇到的是AJAX的“异步”部分。如果要进行物理操作(如Javascript文件中的逐行操作),可以使用
.success
.pipe
.done
jQuery方法添加回调以进一步处理数据。如果可以的话,不要嵌入回调,否则会产生所谓的“多米诺效应”。

您遇到的是AJAX的“异步”部分。如果要进行物理操作(如Javascript文件中的逐行操作),可以使用
.success
.pipe
.done
jQuery方法添加回调以进一步处理数据。如果可以的话,不要嵌入回调,否则会产生所谓的“多米诺效应”。

AJAX调用是异步调用,并且post状态文本在回调中。因此,只有在浏览器收到POST的响应后,该位才会运行。另一方面,函数调用已经结束,其余代码将立即运行。欢迎来到异步的奇妙世界!你不能那样做,这是一个新的世界。谢谢回复。AJAX调用是一个异步调用,post状态文本在回调中。因此,只有在浏览器收到POST的响应后,该位才会运行。另一方面,函数调用已经结束,其余代码将立即运行。欢迎来到异步的奇妙世界!你不能那样做,这是一个新的世界。谢谢你的回复。谢谢你清楚的回答。这实际上是有道理的:“异步”当然。如果可能的话,我会在几分钟内将此设置为答案。我也很感谢其他的回答/评论。谢谢您的明确回答。这实际上是有道理的:“异步”当然。如果可能的话,我会在几分钟内将此设置为答案。我也感谢其他的回答/评论。