-1

私はこの問題を抱えています。たとえば、functionA()という関数があり、functionB()という別の関数の結果が必要です。

var globalVar="";
function functionA(){
    //...
    functionB();
    //here i have to use the global variable (that is empty because functionB isn't finished)
}
function functionB(){
    //ajax request
    globalVar=ajaxRequest.responseText;
}

functionAの実行を続行する前にfunctionBを終了させるにはどうすればよいですか?ありがとう!

これはコードです:

var ingredientiEsistenti="";
function ShowInserisciCommerciale() {
    getElementiEsistenti();
    JSON.parse(ingredientiEsistenti);
}

function getElementiEsistenti(){

// prendo gli ingredienti esistenti.
var url = "http://127.0.0.1:8080/Tesi/Ingredienti";
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", url, false);
xmlHttp.send(null);
xmlHttp.setRequestHeader("Content-type",
        "application/x-www-form-urlencoded");
xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) // COMPLETED
    {
        if (xmlHttp.status == 200) // SUCCESSFUL
        {
            ingredientiEsistenti = xmlHttp.responseText;
        } else {

            alert("An error occurred while communicating with login server.");
        }
    }
};
}
4

3 に答える 3

1

邪悪なグローバル変数を必要としない多くのオプションの 1 つがあります。

  • 実行したいコードをonreadystatechangeajax リクエストのコールバックに移動します。そうすれば、応答を受け取るまで実行されません。

  • を再定義functionAして、最初のビットをスキップできるパラメーターを取るようにします。

  • リクエストを同期化しますが、推奨されません

  • タイムアウト/間隔を使用して、リクエストの準備完了状態を手動で確認します (ブルート フォース、どちらも推奨されません)。

  • おそらく、あなたの特定のケースでは、トリックを実行できるワーカーのトリックもあります


function functionA(skipDown)
{
    skipDown = skipDown || false;
    if (skipDown === false)
    {
        //doStuff
        return functionB();//<-- call functionA(true); from the readystatechange callback
    }
    //this code will only be called if skipDown was passed
}
于 2012-11-06T18:52:46.700 に答える
0

呼び出しが非同期の場合、JavaScript でスリープ/待機を行うことはできません。このアクションを実行するには、コールバック パターンを使用する必要があります。

XMLHttpRequest を同期化することは可能ですが、それによって別の問題が発生する可能性があります。他のすべてのアクションがブロックされるため、ブラウザーがハングアップする可能性があります。そのため、ローディング アニメーションを表示したい場合、実行されない可能性が高くなります。

于 2012-11-06T18:46:14.923 に答える
0

AJAX リクエストを同期させることができます。https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Synchronous_and_Asynchronous_Requests

var request = new XMLHttpRequest();
// Last parameter makes it not asnychronous
request.open('GET', 'http://www.mozilla.org/', false); 
request.send(null);
// Won't get here until the network call finishes
if (request.status === 200) {
  console.log(request.responseText);
}

ただし、サーバーが応答するのを待っている間、UI がブロックされます。これは、ほとんど望んでいないことです。その場合、コールバックを使用して結果を処理する必要があります。

グローバル変数に依存せずにコールバックを使用する例を次に示します。あなたはいつもそれらから逃げるべきです

function ShowInserisciCommerciale(  ) {
    getElementiEsistenti(function(responseText) {
        JSON.parse(responseText);
    });
}

function getElementiEsistenti(successCallback){
    var url = "http://127.0.0.1:8080/Tesi/Ingredienti";
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("POST", url, false);
    xmlHttp.send(null);
    xmlHttp.setRequestHeader("Content-type",
            "application/x-www-form-urlencoded");
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4) // COMPLETED
        {
            if (xmlHttp.status == 200) // SUCCESSFUL
            {
                successCallback(xmlHttp.responseText); 

            } else {

                alert("An error occurred while communicating with login server.");
            }
        }
    };
}
于 2012-11-06T18:46:23.797 に答える