6

長い質問だと思いますので、できる限り説明させてください。

ページの読み込み後に実行したい 2 つの JavaScript 関数があり、それらを function1() および function2() と呼びます。

function1() は AJAX を使用してデータベースから情報を取得し、データベースで取得した情報からコンテンツを div に配置します。また、関数が終了すると、データベースからコンテンツを返します。

function2() は、正しく実行するためにデータベースから値を取得する必要があるため、function1() が値を返すまで待機してから function2() を実行する必要があります。残念ながら、私のコードは機能していません。詳しくは説明しませんが、コードの概略を以下に示します。

function function1() {
if (some_cookie_exists) {
  //run some code
} else {
  //send parameters through "POST"
  xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    var a = some_value_from_database;
    // change div content
  return a;
  }
  }
//sending parameters
}
function function2(a) {
//run code that depends on value of "a"
}

window.onload = function() {
var data = function1();
function2(data);

私が得るエラーは、var データが定義されていないということです。function1() はデータを正常に取得し、意図したとおりに実行されますが、値が欠落しているため、function2() はまったく実行されません。なぜ私がこれを取得しているのか、これをどのように解決する必要があるのか​​ を誰かが理解できますか?

注: 私は Javascript にしか詳しくありません (まだ初心者です)。JQuery については基本的に何も知りません。したがって、これを使用してコードを修正する場合は、これが機能する理由を説明してください (後で問題を解決できます)。

4

3 に答える 3

4

AJAX は非同期です (最初の A は非同期です)。AJAX 操作の結果は function1() では使用できませんonreadystatechange。XMLHttpRequest オブジェクトにアタッチしたハンドラーで取得されます。だから、あなたがどのようにやっているのかは明らかではありません

var a = some_value_from_database;

function1()

あなたがする必要があるのは、ハンドラーfunction2()から呼び出すことです。onreadystatechange

の実際の実装を投稿するfunction1と、より具体的な詳細を提供できる場合があります。

アップデート:

function2()AJAX 呼び出しから値が使用可能になったときに呼び出す方法は次のとおりです。

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        var a = some_value_from_database;
        function2(a);
    }
}
于 2012-12-21T08:10:32.137 に答える
4

コールバックでそれを行います。

function function1(callback) {
    /* ... */
    callback(data); // instead of return
}
var function2 = function(data) { // important: make "function2" a variable so that it can be passed as an argument later on
    /* ... */
}    
window.onload = function() {
    function1(function2); // important: no parentheses after function2, otherwise it would be executed right away
}
于 2012-12-21T08:11:14.433 に答える
0

定義による ajax は非同期であるため、function1 で ajax が完了する前に function2 の実行が開始されます。function1 の ajax 呼び出しの成功コールバックに function2 を配置できるため、ここでは JQuery が役立ちます。

したがって、HTML に JQuery を含めると、次の JS が機能するはずです。

$(function() {   //same as onload
      function1() ;
}

function function1() {
        $.ajax({
              url: "url here",
              type: "GET",
               success: function(data) { // data is what is returned in ajax response
                           // rearrange divs
                            function2(data);
                }
           });
);

function function2(data) {
}

JQuery ajax 関数の詳細: http://api.jquery.com/jQuery.ajax/

于 2012-12-21T08:27:12.633 に答える