6

为什么这个函数不返回true

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

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

这不正是我想要做的。我有一个名为 test() 的函数,它在 1 秒后执行一些操作。我想在 test() 完成时执行下一个函数(所以在超时之后)。

我怎么知道我什么时候完成了测试?

4

4 回答 4

9

跟踪您的代码,这就是发生的事情。

  1. test()被调用。
  2. setTimeout安排一个函数在 1000 毫秒后调用。
  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);
});

作为第二个参数传递的函数将在执行代码test()时被调用。setTimeout回调函数的参数将告诉是否strok

于 2012-11-30T10:03:45.427 回答
4

对于初学者来说,settimeout 是一个异步方法,因此实际函数 test() 将在 settimeout 代码运行之前完成并返回。

其次,但是,您只从 settimeout 函数而不是测试函数返回 true,因此您永远不会得到除 false 之外的任何内容。

于 2012-11-30T10:04:18.527 回答
1

它不会返回 true,因为异步函数 setTimeout() 将在 1000 毫秒后执行,并且 console.log 将以正常方式执行,而无需等待您的“测试”函数。

于 2012-11-30T10:21:15.620 回答