开发者问题收集

承诺未定义

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