Javascript 返回true和setimout

Javascript 返回true和setimout,javascript,Javascript,为什么此函数不返回true function test(str) { window.setTimeout(function() { if(str == 'ok') { return true; } }, 1000); } console.log(test('ok')); 那不是我想做的。 我有一个函数nammed test(),它在1秒后执行一些操作。 我想在test()完成时执行下一个函数(所以在超时之后) 如何知道

为什么此函数不返回
true

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

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

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


如何知道测试何时完成?

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

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

函数测试(str,回调){
setTimeout(函数(){
回调(str='ok');
}, 1000);
}
测试('ok',功能(结果){
控制台日志(结果);
});

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

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


然而,第二,您只是从settimeout函数返回true,而不是从test函数返回true,因此除了false之外,您永远不会得到任何结果。

跟踪您的代码,下面是发生的情况

  • 调用了
    test()
  • setTimeout
    计划在1000毫秒后调用函数
  • test()
    结束执行,没有执行
    return
    语句,因此返回
    undefined
  • 大约1000毫秒后,预定功能启动
  • 调度函数将
    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);
    });
    

    此代码将完成您似乎期望的更多操作。

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

    这样调用setTimeout的目的是什么?我想执行一些操作,过一段时间,我想知道这个函数什么时候完成你走错了方向。Cos set timeout将在不同的范围内调用函数。我可以知道在setTimeout函数完成后,您是否有任何函数要调用,我可以帮助您。测试在setTimeout执行之前很久就完成了。要知道某件事情何时完成,请按照答案中的描述使用回调。那么如何操作,以
    返回true
    返回false
    ?我想知道这个函数什么时候完成:)@dragon75:我想这取决于你想做什么。目前我认为还不清楚该函数使用的是什么
    setTimeout
    。如果您只是想让测试函数返回true,那么就去掉超时代码。您知道函数已经完成,因为回调正在执行!因此,在回调中放入您需要遵循的任何代码。
    callback
    匿名函数的参数将参数隐藏到您实际需要的
    test
    函数。@dragon75:
    setTimeout(function(){callback(str='ok');},1000)