为什么此函数不返回true
?
function test(str) {
window.setTimeout(function() {
if(str == 'ok') {
return true;
}
}, 1000);
}
console.log(test('ok'));
这不正是我想做的事情。 我有一个函数nammed test(),他在1秒后做了一些动作。 我想在test()完成时执行下一个函数(所以在超时之后)。
我怎么知道测试结束的时间?
答案 0 :(得分:8)
跟踪您的代码,这是发生的事情。
test()
被调用。setTimeout
安排一个函数在1000毫秒后调用。test()
结束执行,没有执行return
语句,因此返回undefined
。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);
});
此代码将执行您所期望的更多内容。
答案 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将以正常方式执行,而无需等待您的'测试'功能