返回true和settimeout

时间:2012-11-30 10:01:42

标签: javascript

为什么此函数不返回true

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

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

这不正是我想做的事情。 我有一个函数nammed test(),他在1秒后做了一些动作。 我想在test()完成时执行下一个函数(所以在超时之后)。

我怎么知道测试结束的时间?

4 个答案:

答案 0 :(得分:8)

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

  1. test()被调用。
  2. setTimeout安排一个函数在1000毫秒后调用。
  3. test()结束执行,没有执行return语句,因此返回undefined
  4. 大约1000毫秒后,计划的功能将被激活。
  5. 预定函数将true返回到任何内容。
  6. 换句话说,它只是不起作用。 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);
    });
    

    此代码将执行您所期望的更多内容。

答案 1 :(得分:6)

它不会返回true,因为setTimeout调用是异步的。此外,代码中的返回值true来自内部函数。

处理此类程序流的常规方法是将回调传递给异步函数。

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

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

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

答案 2 :(得分:4)

首先,settimeout是一个异步方法,因此实际的函数test()将在settimout代码运行之前完成并返回。

其次,你只是从settimeout函数而不是test函数返回true,所以除了false之外你永远不会得到任何东西。

答案 3 :(得分:1)

它不会返回true,因为异步函数setTimeout()将在1000 ms后执行,console.log将以正常方式执行,而无需等待您的'测试'功能