返回true和setimout

dra*_*n75 6 javascript

为什么这个函数没有返回true

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

console.log(test('ok'));
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*yne 8

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

  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);
});
Run Code Online (Sandbox Code Playgroud)

此代码将执行您似乎预期的更多操作.


Dav*_*son 6

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

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

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

test('ok', function (result) {
    console.log(result);
});
Run Code Online (Sandbox Code Playgroud)

作为第二个参数传递的函数test()将在setTimeout执行代码时被调用.回调函数的参数会告诉我们,如果str是有人ok与否.