承诺函数在单独的文件中

时间:2017-08-29 04:33:16

标签: javascript express promise

我可以让这个函数在一个文件中工作,但我想通过分成多个文件来保持清洁。

// library.js file
module.exports = {
    get: () =>{
        return new Promise((reject, resolve) =>{
            return resolve(https.get('https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token, (res) =>{
                res.setEncoding('utf8');
                return res.on('data', (data) =>{
                    return data;
                });
            }));
        });
    }
}

我尝试记录这个,但它没有显示任何内容?

// server.js file
igLib.get().then((data) => {
    console.log("testing: " + data);
})

但是,如果我只是做一个简单的日志..

// server.js file
console.log(igLib.get());

我以某种方式获取没有res.setEncoding('utf8')的数据。

有关怎么做的提示?

更新 我无法承诺工作,我很抱歉为我提供了很好的答案,但我继续使用了请求承诺模块。这就是它的样子:

// library.js file
var instagramSelfUrl = 'https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token;

module.exports = {
    get: () =>{
        return rp(instagramSelfUrl).then((res) =>{
            return res;
        });
    }
}

这是我console.log的地方:

// server.js file
    igLib.get().then((data) =>{
    console.log(data);
});

它更简单,它的工作原理。如果除了使用模块来解决问题之外,请让它知道并发布!感谢所有发布和帮助的人!

3 个答案:

答案 0 :(得分:1)

您创建的承诺应使用响应中的数据解析。

// library.js file
const https = require('https');
const instagramSelfUrl = 'https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token;

module.exports = {
    get: () => new Promise(function (resolve, reject) {
        https.get(instagramSelfUrl, res => {
            var chunks = [];
            res.setEncoding('utf8');
            res.on('data', chunk => chunks.push(chunk));
            res.on('end', () => resolve(chunks.join('')));
        });
    })
};
事实上,以上是不完整和脆弱的。例如,请求错误或响应状态500应该拒绝承诺,但是没有错误处理。或者当响应不是真正的UTF-8时,它将不正确地解码数据。这些只是这里最明显的两个问题。

HTTP请求的宣传是一个已解决的问题。我强烈建议您使用one of the available libraries而不是滚动自己的代码,这会再次造成所有错误。

const request = require('request-promise');
const instagramSelfUrl = 'https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token;

module.exports = {
    get: () => request(instagramSelfUrl)
};

现在功能已经完成并且行为正常,即使在极端情况下也是如此。它也很短,根本没有理由写一个单独的功能。

答案 1 :(得分:0)

似乎你没有正确地返回数据试试这个:

// library.js file
module.exports = {
    get: () =>{
        return new Promise((reject, resolve) =>{
            https.get('https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token, (res) =>{
                res.setEncoding('utf8');
                return res.on('data', (data) =>{
                    return resolve(data);
                });
            });
        });
    }
}

答案 2 :(得分:0)

你可以做这样的事情

module.exports = {
    get: () =>{
        return new Promise((resolve, reject) =>{
            https.get('https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token, (res) =>{
                res.setEncoding('utf8');
                res.on('data', (data) =>{
                    resolve(data);
                });
            }).on('error', (e) => reject(e))
        });
    }
}

有关承诺的更多信息,您可以访问https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise