6

この関数が返さないのはなぜtrueですか?

function test(str) {
    window.setTimeout(function() {
        if(str == 'ok') {
            return true;
        }
    }, 1000);
}

console.log(test('ok'));

それはまさに私がやりたいことではありません。1 秒後にいくつかのアクションを実行する test() という名前の関数があります。test() が終了したら(タイムアウト後)、次の関数を実行したい。

テストがいつ終了したかを知るにはどうすればよいですか?

4

4 に答える 4

9

コードをトレースすると、次のようになります。

  1. test()が呼び出されます。
  2. setTimeout1000ミリ秒後に呼び出される関数をスケジュールします。
  3. test()実行を終了し、returnステートメントは実行されなかったため、undefined代わりに返されます。
  4. 約1000ミリ秒後に、スケジュールされた関数が起動します。
  5. スケジュールされた関数は何にも戻りtrueません。

言い換えれば、それはそのようには機能しません。JSインタープリターは一時停止せず、タイムアウトを超えて続行します。JSで実行を一時停止することはできません。


代わりに、通常はコールバックを使用します。

function test(str, callback) {
  window.setTimeout(function() {
    if (str === 'ok') {
      callback(true);
    }
  }, 1000);
}

// logs 'true' 1000 ms later
test('ok', function(result) {
  console.log(result);
});

// logs nothing, callback never fires
test('NOTOK!', function(result) {
  console.log(result);
});

このコードは、あなたが期待していたように見えることをさらに実行します。

于 2012-11-30T10:08:50.850 に答える
6

呼び出しが非同期でtrueあるため、返されません。setTimeoutまた、コードの戻り値trueは内部関数から取得されます。

このようなプログラム フローを処理する通常の方法は、コールバックを非同期関数に渡すことです。

function test(str, callback) {
    window.setTimeout(function() {
        callback(str == 'ok');
    }, 1000);
}

test('ok', function (result) {
    console.log(result);
});

2 番目の引数として渡された関数は、コードの実行test()時に呼び出されます。setTimeoutコールバック関数への引数は、strあったokかどうかを示します。

于 2012-11-30T10:03:45.427 に答える
4

まず、settimeout は非同期メソッドであるため、実際の関数 test() は settimout コードが実行される前に終了して戻ります。

ただし、第二に、テスト関数ではなく settimeout 関数からのみ true を返すため、false 以外は取得されません。

于 2012-11-30T10:04:18.527 に答える
1

非同期関数 setTimeout() は 1000 ミリ秒後に実行され、console.log は「テスト」関数を待たずに通常の方法で実行されるため、true は返されません。

于 2012-11-30T10:21:15.620 に答える