3

すべてのコードが実行される前に関数が終了してしまうという悪夢に見舞われます。カウンターを構築しようとしていますが、コードが終了したときにのみ戻ります。

私はこれを次のようにエミュレートしました(私はそれが素晴らしいものではないことを知っていますが、誰かが私を正しい方向に向けることができれば、私は非常に感謝しています):

//I want this to alert "Done"
alert(timerCheck());

function timerCheck() {
    var finished;
    var myLoop = 5;
    for (i = 0; i < myLoop; i++) {
        //This is emulating the slow code
        window.setTimeout(checkFinished, 900);
        alert(i);
    }
    function checkFinished() {
        //I originally had the "return here, before realising my error
        finished = true;
    }
    if (finished) {
        //This is where my problem is 
        return "done";
    }
}

私が言ったように、非常に単純化された例 - 誰かが間違いを指摘できれば、私は多くの手間を省くことができます!

4

3 に答える 3

4

関数が非同期関数を呼び出して依存している場合、その関数の戻り値を同期的に取得することはできません。

コールバックを使用する必要があります。詳細については、この質問を参照してください。

たとえば、関数は次のようになります。

// pass a callback which gets the result of function
timerCheck(function(result) {
    alert(result);
});

function timerCheck(callback) {
    var myLoop = 5,
        j = 0;

    for (var i = 0; i < myLoop; i++) {
        // This is emulating the slow code
        // this will invoke `checkFinished` immediately, 
        // after 900ms, after 1800ms, after 2700ms and after 3600ms
        window.setTimeout(checkFinished, i * 900);
    }

    function checkFinished() {
       j++;
       // after checkFinish was called 5 times, we invoke the callback
       if(j === 5) {
           callback('done');
       }
    }
}
于 2012-05-24T15:09:48.793 に答える
0

FelixKling がコメントしたように、関数が非同期関数を呼び出して依存している場合、その関数の戻り値を同期的に取得することはできません。この種の仕事の解決策の 1 つは、次のようなものです。

var finished = false;

function mySlowCode() {
    setTimeout(function() {
        finished = true;
    }, 1000);
}

function timerCheck() {
    // legend...
    (function waitForIt() {
        setTimeout(function() {
            if (!finished) {
                waitForIt();
            } else {
                // dary!
                letsDoIt();
            }
        }, 10);
    })();
}

function letsDoIt() {
    alert("done");
}

mySlowCode();
timerCheck();

関数は、関数が終了すると関数timerCheck()を呼び出します。letsDoIt()mySlowCode()

于 2012-05-24T15:14:51.657 に答える
-3

関数名の後に括弧なしで試してみましたか?

alert(timerCheck);
于 2012-05-24T15:04:57.647 に答える