Promise无法传递值

qianjiahao
  • 8.4k

我在抓一个网页信息,然后希望抓取完毕后,创建文件,写入文件。

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,这个例子写的不好,希望能告知错误和更好的写法~谢谢

回复
阅读 3.1k
2 个回答
✓ 已被采纳

return deferred.promise; 应该在 function fatch 返回,而不是 end 的回调里。

顺便一提,deferred.reject(err); 这句后面应该跟一个 return,这是个逻辑错误,跟本问题无关。

首先,fatch应该是拼写错误,“获取”是fetch

然后你的方法确实没有返回值哦,return deferred.promise;写在end()的回调里了,应该提到fetch方法那一层

还有后面那个then的写法也不对,then应该接受回调,你直接写console.log(data)肯定是不能得到预期的效果的

这和promise其实没有什么关系,是基本js语法的问题……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏