2

私の質問が主観的/客観的であるかどうかはわかりませんが、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を使用してデバッグを試み、コードを1行ずつループしました。そのようにして、ブラウザーは必要な処理を実行します。新しい関数を実行して、ウィザードに次のパネルを表示します。

コードに多くのConsole.logs()を配置した後、これはJavaScriptのタイミングに関するものである必要があることがわかりました。C#では、コードは1行ずつ実行されますが、JavaScriptは実行されないようです。そのConsole.log( "test")を配置することにより、「Post status:Success!」の前に「test」がコンソールに表示されることに気付きました。

だからここに私の質問があります、ブラウザが私のコードを実行する方法を制御できるように、JavaScriptコードをどのように書くべきですか?以下のコードをCheckAndSendAddEntityForm()の最後に本当に置き換える必要がありますか?

//check if persisted and go to next step
        if (persistedObject.isPersisted) {
            MyLibrary.fn.InitAddAnotherEntityForm(persistedObject.gdEntityId);
        } else {
            alert("fout");
        }

これは私がJavaScriptを書かなければならない方法ですか:1つの大きなドミノ効果ですか、それとも私は何か間違ったことをしているだけですか?

4

4 に答える 4

3

$ .postはAJAX呼び出しのショートカットであり、AJAXは定義上非同期です。つまり、処理を続行する前に応答を待機しません。通常のAJAX()メソッドに切り替えると、falseに設定できる非同期オプションがあり、期待どおりに動作します。

または、AJAXリクエストが正常に返されたときに実行する関数を定義することもできます。この関数では、プロセスチェーンの次のステップを呼び出すことができます。

于 2012-08-20T22:15:17.583 に答える
1

AJAX呼び出しは非同期です。つまり$.post、リクエストが完了するとコールバックメソッドが公開しますが、JavaScriptはinvoketoが終了するとすぐに実行を継続します$.post。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");
        }
});
于 2012-08-20T22:18:00.647 に答える
0

JavaScriptはシングルスレッドです。非同期機能がある場合、単純なブールセマフォ変数は、一部のプロセスの実行中に関数の呼び出しを許可しないようにするのに役立ちます。

非同期タスク(ドミノラインなど)を1つずつ実行する場合は、コールバック関数を使用する必要があります。

于 2012-08-20T22:17:16.507 に答える
0

あなたが遭遇しているのは、AJAXの「非同期」ビットです。物理的に(Javascriptファイルの1行ずつのように)必要な場合は.success.pipeまたは.donejQueryメソッドを使用して、データをさらに処理するためのコールバックを追加できます。あなたがそれを助けることができるならばあなたのコールバックを埋め込まないでください、さもないとあなたがそれを呼ぶときにあなたは「ドミノ効果」を得るでしょう。

于 2012-08-20T22:20:06.377 に答える