我在抓一个网页信息,然后希望抓取完毕后,创建文件,写入文件。
fatch的方法是对的,能返回类似这样的值:
[{ href: 'http:/segmentfault.com/q/1010000002714413',
title: 'js图片轮播' },
{ href: 'http:/segmentfault.com/q/1010000002714953',
title: 'stackoverflow, segmentfault 之类的网站是如何实现在输入问题时,下方出现模糊搜索的结果提示?' },
{ href: 'http:/segmentfault.com/q/1010000002711687',
title: 'js与局域网' } ]
我用q
模块来改写函数:
function fetch(url) {
var deferred = Q.defer();
var result = [];
superagent.get(url)
.end(function(err, data) {
if (err) {
deferred.reject(err);
return ;
}
var $ = cheerio.load(data.text);
$('.question-stream .stream-list__item').each(function(index, ele) {
var $ele = $(ele);
var href = path.join(url, $ele.find('.title a').attr('href'));
var title = $ele.find('.title').text();
result.push({
href: href,
title: title
});
});
});
// console.log(result);
deferred.resolve(result);
return deferred.promise;
}
调用:
fetch(url).then(function(data){
console.log(data);
},function(err){
console.log(err);
});
得到的是空数组,奇怪啊。。。
刚刚学promise,这个例子写的不好,希望能告知错误和更好的写法~谢谢
巴扎黑2017-04-10 15:12:12
return deferred.promise;
应该在 function fatch
返回,而不是 end
的回调里。
顺便一提,deferred.reject(err);
这句后面应该跟一个 return
,这是个逻辑错误,跟本问题无关。
迷茫2017-04-10 15:12:12
首先,fatch
应该是拼写错误,“获取”是fetch
然后你的方法确实没有返回值哦,return deferred.promise;
写在end()的回调里了,应该提到fetch方法那一层
还有后面那个then
的写法也不对,then应该接受回调,你直接写console.log(data)
肯定是不能得到预期的效果的
这和promise其实没有什么关系,是基本js语法的问题……