async function fetch() {
for (let i = 1; i < 1318; i++) {
await SpiderPage(basicUrl + i);
}
}
async function SpiderPage(urllll) {
console.log(“urllll::” + urllll)
return new Promise((resolve, reject) => {
superagent.get(urllll)
.charset(‘utf8’)
.end(function(err, sres) {
if (err) {
return next(err);
}
mkdir(sres)
});
resolve();
})
}
function mkdir(sres) {
var $ = cheerio.load(sres.text);
var eachUrl;
var eachTitle;
var eachWriter;
var eachSummary;
var eachData;
var eachLook;
var singleContext = [];
用 for 遍历,然后一次拿2个,或者多个出来 再 Promise.all 之后 再 await 呗。
你就按照并发数量数量push到数组里面 用await Promise.all
同意楼上的观点,建议楼主去看看bluebird中Promise.map源码,bluebird可以做到控制并发数量。
来自酷炫的 CNodeMD
await Promise.all([…]);
@Bingmang 好,我看看
@zhang962976642 能不能贴个代码,小白表示蒙蔽
@Sunshine168 能不能贴个代码,小白表示蒙蔽
@MiYogurt 能不能贴个代码,小白表示蒙蔽
var cheerio = require(“cheerio”); var superagent = require(“superagent”); var fs = require(‘fs’); const charset = require(‘superagent-charset’); charset(superagent);
var pages = []; var basicUrl = ‘http://www.u148.net/list/’
async function fetch() { for (let i = 1; i < 1318; i++) { await SpiderPage(basicUrl + i); } }
async function SpiderPage(urllll) { console.log(“urllll::” + urllll) return new Promise((resolve, reject) => { superagent.get(urllll) .charset(‘utf8’) .end(function(err, sres) { if (err) { return next(err); } mkdir(sres)
}
function mkdir(sres) { var $ = cheerio.load(sres.text); var eachUrl; var eachTitle; var eachWriter; var eachSummary; var eachData; var eachLook; var singleContext = [];
}
fetch();
可以参考下callback实现的
用这个 promise.map 包
其实和 async.parallelLimit 一样 可以使用 bluebird Promise.map, 不喜欢和 bluebird 绑死的用我写的这个 promise.map包即可
@MiYogurt @Sunshine168 function getPage(singeUrl) { return new Promise((resolve,reject)=>{ superagent.get(singeUrl) .set({‘Content-Type’: ‘application/json’, ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36’}) .charset(‘utf8’) .end(function (err, sres) { if (err) throw err; utils.singleRequest(sres,db) }); resolve(‘resolve==’+singeUrl) }) } let flag = true; pages.forEach((item) => { if(flag){ flag = false; let promises = item.map(function (url) { return getPage(url); }); Promise.all(promises).then(res => { flag = true; }) } }) 就按照您说的这种办法,每次取五个url,如果都成功,flag=false,但是事实确实flag永远等于false;;;是我哪里写错了么
通过事件分发也不错。
连个 markdown 都格式化不好,哎,算了。
@MiYogurt 谢谢小哥,,解决了
既然不想用类库, 那就自己写个队列控制并发
不想用库,那就把 https://github.com/sindresorhus/promise-fun 对应的方法,CTRL+C 过来呗 -.-!!