这几天碰到一个问题,说起来也不难,只是自己promise理解的比较粗浅,导致一直停滞不前。
需要完成的功能是,抓取一个产品列表(静态页面)。我用request模块并自己封装了promise方法,在抓取的过程中发现我需要将所有的分页地址抓下来,再使用 promise.all 对返回的数组进行下一步操作。
由于JS基础太过薄弱,加上对异步,递归,promise,都没有很深入的理解。我在实现了递归请求并且将数据保存到数组中之后,不知道怎样将数据返回。我写的代码类似这样。
结果发现这样完全不行, getAllPage(url).then(data=> console.log(data)//undefined) ,拿不到值,但是在 resolve(pages)前面加入 console.log(pages) 最后能打印结果,只是打印的顺序不对,先是外面的函数 getAllPage 打印结果,再到内部的 currPage 打印结果。
所以到这时候我才明白,创建promise实例,里面的代码也是同步的,并不会像我期待的那样(代码还没执行到 resolve 的时候,会一直挂起等待(暴露JS学的差的事实)),所以返回做了点修改。
这样可以实现我要的功能了。每次查询有下一页的时候就跳到catch里面执行语句,就能把代码hold住了。
PS:得学一下markdown写简书了,代码贴成图片好丑