我只是试图在延迟后返回一个值,但我得到的只是数字1.如果我再次调用相同的函数,我得到2,3,4等等所以我做了一个奇怪的计数器但是不是我想要的!
let wait = n => setTimeout(_ => n, n*1000);
console.log(wait(5));
我已经尝试过所有我能想到的变化。这是某种范围问题吗?
有什么想法吗?
答案 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中的async
和await
来获得您想要的更接近的结果:
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
函数。