我想我知道问题出在哪里了?
来源:10-5 爬虫代码实现1

小学生6年级
2018-07-26
小伙伴们注意,老师这里page.waitfor就没用!! 虽然给forEach中的函数包裹了一个async 。但事实上每一个async都不会互相等待。
也就是这些挂起的异步等待最终会通通一起执行,并发量这么大图片肯定会出问题。也就是这个waitfor最终是一起等待。。。。!!而这时候主线程forEach早已经结束了。。。。。总的来说老师这里实现的是有问题的。应该在外部用一个自己实现的async包裹,内部用for循环遍历。每一个for循环用await来等待。代码如下
async function test() { for(let i = 0; i < srcs.length; i++) { await srcImages(srcs[i], config.cat) console.log(3) } } test()
这样子就好多啦!基本都能成功。但是有时候会少几张图片,为什么呢?我在后面嵌套的代码中也分别设置打印1,2。也就是说正常按步骤来执行的话 应该是会打印1,2,3。但事实上每次总会先打印几次3.然后才是正常的稳定的1,2,3。这一点问题我很困惑。也还没想明白,不过3点了,哎,rilegou。赶紧睡觉吧。明天起来再想。有小伙伴看到知道问题麻烦留言告诉我下问题的原因。(后面的代码我没改动。与老师的一样,就是在每个async末尾加了个打印数字方便验证顺序)。
不过话说回来,虽然感觉老师后面有点不走心了。还有前面几章节一个大杂烩砸过来受不了。但是就凭借node的那一章节,还有让我发现这个async与forEach结合产生的问题。我觉得就值这门课的价钱了!
2回答
-
Samaritan
2018-07-29
确实是我代码的失误,这块应该用 for 循环来挂起,用 forEach 不会有这效果
00 -
小学生6年级
提问者
2018-07-26
首先第一点! 我之前说的每次都会先连续打印几个3,是我自己的问题。我在baese64中忘记设置打印。。。。第二点!为什么还是会有图片缺失呢?
饿。。还是我的问题。实际上并不会有图片缺失。我也不清楚为啥,反正第二天一直试,每次都完美搞定。后来仔细想了想。pipestream只要开始了以后就一定会给我们输入完毕。并不需要担心。我是受到了之前的误导。按老师那样写法之所以出问题。其实原因应该同时发起了大量的Pipe。也就是这一个Pipe都还没过去。另一个马上又跟着Pipe。并且因为此时时间完全相同,也就是另一个Pipe的文件名也完全相同!!导致图片缺失。而像我这样子弄完实质上已经不存在这个问题,因为这样子一轮下来 Date.now()必定已经不一样了。也就是实质上像老师那样子弄,但是你的文件名格式不要做成Date.now()。而是用其他的方式来作为解码。应该也是没有问题的。看下面这张图,顺序循环,最后基本也是同时写入完毕的。
00
相似问题