} else {
res.options.npolisResolve(res)
}
}
options.headers = Object.assign({}, options.headers, {
'X-Requested-With': 'XMLHttpRequest',
})
super(options)
}
queue(options = {}) {
// 每次抓取都是一个新的 promise
return new Promise((resolve, reject) => {
// 然后在 options 里挂载上 resolve 和 reject
// 这样在全局 callback 上就可以用到了
options.npolisResolve = resolve
options.npolisReject = reject
const pr = options.preRequest
options.preRequest = (options, done) => {
typeof pr === 'function' && pr(options, noop)
// 在这里也可以做一些通用的抓取前的处理
done()
}
super.queue(options)
})
}
// direct api 同理
}
// 使用
const Crawler = require('./utils/crawler')
const crawler = new Crawler('示例爬虫 namespace')
crawler
.queue({
uri: 'xxx',
preRequest: options => log('开始抓取'),
})
.then(res => {
log('爬取成功')
return res
})
.catch(err => {
log('爬取失败')
throw err
})
promise 化后,多个爬取任务同步爬取写法就友好多了:
// 抓取任务1
const fetchTask1 = () => crawler.queue({/* 配置 */}).then(res => handle(res))
// 抓取任务2
const fetchTask2 = () => crawler.queue({/* 配置 */}).then(res => handle(res))
const fetch = () => {
return Promise.all([
fetchTask1(),
fetchTask2(),
])
}
fetch()
这样就完成了对 node-crawler 的 promise 化改造了









