第 160 题:输出以下代码运行结果,为什么?如果希望每隔 1s 输出一个结果,应该如何改造?注意不可改动 square 方法
const list = [1, 2, 3] const square = num => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(num * num) }, 1000) }) } function test() { list.forEach(async x=> { const res = await square(x) console.log(res) }) } test()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(24)
题目本身有些问题,定时功能实现 square 中需要进行误差修正的
精品
大哥 这里面都没有return 为什么await _ (_) 会是上一次的方法呢 怎么累积的呢 ???
传统的 不都是这样的吗
var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
能帮忙解答下吗 迷茫。。。。。
promise的实现根本没有输出呢
因为async函数的返回值是 Promise 对象
一道题可以导出好多知识点,受教了各位大佬
forEach大概可以这么理解
所以是1秒后输出1, 4, 9; 几乎同时;但是有调用先后顺序;
改进的话, 大家都答了, 我就不嫌丑了...
我以为我会,我答出来了,过来一看,我还是太年轻了
《ES6 入门》里面是这样介绍的:
reduce 方法的第一个参数是 async 函数,导致该函数的第一个参数是前一步操作返回的 Promise 对象,所以必须使用await等待它操作结束
如果没有
await _
这一行,得到的结果和forEach()
是一样的,可以理解为 @linsicong003 所说的:源码里用 while 来一次性执行了所有回调
?添加一行打印:
打印结果:
为什么大厂面试的题都这么蹊跷???
await _ 这个怎么理解呀 大哥
直接在forEach 里面套个setTimeOut 不就可以了
function test() {
list.forEach(async x => {
setTimeout(async () => {
const res = await square(x)
console.log(res)
}, 1000 * x)
})
}
《ES6 入门》中还提到了使用 reduce 解决:
@sl1673495 窃以为您的第三个串行方案的第四行代码后面应该加上.then(res => console.log(res))
你这个用 while 来一次性执行了所有回调描述不太准确吧,普通的for 等于同一个块作用域连续await,而forEach的回调是一个个单独的函数,跟其他回调同时执行,互不干扰
同时输出的是 1、2、3 的平方也就是 1 、4、9
一秒后同时输出 1、4、9
如果要每隔一秒输出把 forEach 换成普通 for 循环或者 for...of... 循环即可
这里并行进行是因为 forEach 实现的问题,源码里用 while 来一次性执行了所有回调
具体参考官网 polyfill: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
forEach是不能阻塞的,默认是请求并行发起,所以是同时输出1、4、9。
串行解决方案:
当然,也可以用
for of
语法,就是帅:还有一个更硬核点的,也是 axios 源码里所用到的,利用 promise 本身的链式调用来实现串行。