我想我知道问题出在哪里了?

来源: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 不会有这效果

0
0

小学生6年级

提问者

2018-07-26

首先第一点! 我之前说的每次都会先连续打印几个3,是我自己的问题。我在baese64中忘记设置打印。。。。第二点!为什么还是会有图片缺失呢?

饿。。还是我的问题。实际上并不会有图片缺失。我也不清楚为啥,反正第二天一直试,每次都完美搞定。后来仔细想了想。pipestream只要开始了以后就一定会给我们输入完毕。并不需要担心。我是受到了之前的误导。按老师那样写法之所以出问题。其实原因应该同时发起了大量的Pipe。也就是这一个Pipe都还没过去。另一个马上又跟着Pipe。并且因为此时时间完全相同,也就是另一个Pipe的文件名也完全相同!!导致图片缺失。而像我这样子弄完实质上已经不存在这个问题,因为这样子一轮下来 Date.now()必定已经不一样了。也就是实质上像老师那样子弄,但是你的文件名格式不要做成Date.now()。而是用其他的方式来作为解码。应该也是没有问题的。看下面这张图,顺序循环,最后基本也是同时写入完毕的。

//img.mukewang.com/szimg/5b59529e00010b0203430367.jpg

0
0

Node.js入门到企业Web开发中的应用

Node.js是Web应用开发的一个福音,特别适合中小型系统的快速开发!

1580 学习 · 303 问题

查看课程