JavaScript setTimeout奇怪的行为

时间:2018-01-07 19:06:16

标签: javascript settimeout

我只是试图在延迟后返回一个值,但我得到的只是数字1.如果我再次调用相同的函数,我得到2,3,4等等所以我做了一个奇怪的计数器但是不是我想要的!

let wait = n => setTimeout(_ => n, n*1000);
console.log(wait(5));

我已经尝试过所有我能想到的变化。这是某种范围问题吗?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您从传递给n的回调中返回setTimeout - 而不是外部函数。实际上,您的wait函数返回从setTimeout返回的超时ID。你真正“延迟返回”的唯一方法是使用Promise并在超时后解决:

const wait = n => new Promise(resolve => setTimeout(() => resolve(n), n * 1000));

然后:

wait(5).then(n => console.log(n)) //5

然后wait会返回一个承诺,该承诺会在5秒后解析为n,您可以通过Promise#then访问该承诺。通过承诺,您还可以利用ES2016中的asyncawait来获得您想要的更接近的结果:

const wait = n => new Promise(resolve => setTimeout(() => resolve(n), n * 1000));

(async () => {
  console.log(await wait(5));
})();

await所做的是等待解决的承诺。所以await wait(5)等待从wait返回的承诺解决(在5秒之后)。然后,它记录解析的值。您还会注意到它包含在异步中立即执行箭头功能。要使用await,您需要使用async函数。