承诺未定义
2015-04-29
10596
我想更改使用 Promise 处理回调的函数
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 fatch(url) {
var deferred = Q.defer();
superagent.get(url)
.end(function(err, data) {
if (err){
console.log(err);
deferred.reject(err);
}
var $ = cheerio.load(data.text);
var result = [];
$('.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;
});
}
我期望通过“then”获得结果
fatch(url).then(console.log(data),console.log(err));
但是我失败了:
TypeError: Cannot read property 'then' of undefined
我尝试了这种方式:
function fatch(url) {
var promise = new Promise();
superagent.get(url)
.end(function(err, data) {
if (err){
console.log(err);
promise.reject(err);
}
var $ = cheerio.load(data.text);
var result = [];
$('.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);
promise.resolve(result)
return promise;
});
}
但是它没有像以前那样工作..
TypeError: Promise resolver undefined is not a function
我像这样更改了函数,它正在工作:
function fatch(url) {
var deferred = Q.defer();
var result = [];
superagent.get(url)
.end(function(err, data) {
if (err) {
console.log(err);
}
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;
}
我想获得结果:
fatch(url).then(function(data){
console.log(data);
},function(err){
console.log(err);
});
我不知道为什么数据是 []?
实际上,这是我第一次使用 Promise,我很困惑,如何使用 Promise 改变功能,请帮助我,非常感谢~
2个回答
第三种方法不错,但在返回承诺之前“解决”延迟时,您错了。您同步解决它,而您应该在异步代码中解决它。因此,解决方案实际上是您的 #1 尝试和 #3 尝试的混合:
function fatch(url) {
var deferred = Q.defer();
superagent.get(url)
.end(function(err, data) {
if (err){
console.log(err);
deferred.reject(err);
}
var $ = cheerio.load(data.text);
var result = [];
$('.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;
}
Joel
2015-04-29
您需要
返回
在两个函数末尾创建的承诺。
function fetch(url) {
var deferred = Q.defer();
// ...
return deferred.promise;
}
似乎您正在尝试从回调内部返回它。它需要立即返回(以便可以添加处理程序)。
Thilo
2015-04-29