0

これはばかばかしいほど些細な問題のように思えますが、解決できません。

私はこの機能を持っています。var q文字列の配列に割り当てられます。alert(q)関数が呼び出されると、配列全体が正常に出力されます。

function initQuestions() {
    $.post("quiz.php", { 'func': 'load' }, function(data) {
        var q = data.split(".\n");
        alert(q);
        return q;
    });
}

ただし、関数を使用しようとすると (以下の 2 つの方法で示されているように)、配列が未定義であると言われます。これはなぜですか?

var questions;

$(function() {
    //This doesn't work
    questions = initQuestions();
    alert(questions);

    //Neither does this
    alert(initQuestions());
});

さらに調査したところ、コールバックを追加しましたinitQuestions()が、同じ結果が得られました。

4

3 に答える 3

3

post 呼び出しは非同期です: Async Javascript

基本的に、initQuestions() 関数は終了null前に戻ります。post

次のように考えます。

function initQuestions() {
    $.post("quiz.php", { 'func': 'load' }, function(data) {
        var q = data.split(".\n");
        alert(q);
        return q; // <- returns to the caller of function(data), not initQuestions()!
    });
    return null; // <- This happens before function(data) is complete
}

期待どおりに動作させるには、投稿が成功して終了したときのコールバックを提供する必要があります。

function initQuestions(callback) {
    $.post("quiz.php", { 'func': 'load' }, function(data) {
        var q = data.split(".\n");
        alert(q);
        callback(q);
    });
}

var questions;

function doSomthingWithQuestions() {
    alert(questions); // <- should work
    // do the things with the questions
}

$(function() {
    initQuestions(function(result) {
       questions = result;
       doSomethingWithQuestions();
    });

    // Don't use `questions` here as the callback hasn't fired yet. 
});
于 2013-09-10T05:48:24.597 に答える
0

投稿は非同期です。リターンは期待する関数には行きませんが、成功ハンドラーに行きます:

function initQuestions() {
  $.post("quiz.php", { 'func': 'load' }, function(data) { // <- this function has that return
    var q = data.split(".\n");
    alert(q);
    return q;
  });
}

非同期動作を抑制し、必要なものを実現する方法は次のとおりです

編集:

一部の人々がここで言ったようにasych = false、リクエストが完了するまで JS コードがフリーズするため (接続が遅いと数秒かかる場合があります)、悪い考えです。

questions = initQuestions(); //wrong
fillDivsWithData(questions); //use callback instead:

function initQuestions() {
  $.post("quiz.php", { 'func': 'load' }, function(data) {
    var q = data.split(".\n");
    console.log(q); //diplay this in you browser's JS console
    fillDivsWithData(q);
  });
}

結果は同じですが、ジャガイモのインターネット接続があれば、非同期リクエストのおかげで、JS コードは数秒間フリーズしません。

于 2013-09-10T05:51:53.693 に答える