Javascript 单独文件中的Promise函数

Javascript 单独文件中的Promise函数,javascript,express,promise,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.ac

我可以让这个函数在一个文件中工作,但我希望通过将其拆分为多个文件来保持整洁

// 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;
        });
    }
}
这里是I console.log的位置:

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

它更简单,也更有效。如果有一个解决方案的问题,而不是使用一个模块的工作,请让它知道和张贴!感谢所有发布和帮助的人

您似乎没有正确返回数据,请尝试以下操作:

// 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);
                });
            });
        });
    }
}

你可以这样做

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))
        });
    }
}

有关承诺的更多信息,请访问您创建的承诺应使用响应中的数据进行解析

// 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请求的Promission是一个已解决的问题。我强烈建议您使用,而不是滚动您自己的代码,使所有的错误一遍又一遍

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

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

现在,该功能已完成,即使在拐角处也能正常运行。它也是如此之短,以至于根本不需要编写单独的函数。

单独的文件!嗯,为什么不使用js类呢then@user889030文件和类有什么关系?!您的问题是,您立即使用来自
https.get
(即
未定义的
)的返回值来解决您的承诺,不需要在异步回调中使用
数据
进行解析,而无需
返回
上的
解析的结果。我以前也尝试过这一点,但在这种情况下,我的console.log甚至没有被命中。我不知道您可以将我们解析为回调。我来测试一下,谢谢。是的,我理解函数是多么脆弱:我仍然在尝试承诺=\
function(x){f(x)}
和它的胖箭头表亲
x=>f(x)
在语义上等同于
f
。无论
f
resolve
还是任何其他函数都没有区别。这都是函数之间的相互调用。制作一个只包装另一个函数的函数在大多数情况下都是多余的。我仍然无法得到工作的承诺,但我决定继续使用请求承诺模块。是的,我理解,我只是没有意识到你可以用resolve替换回调函数。最终没能让它工作。谢谢你@Edrich是的,https模块非常低级,您实际上需要处理单独到达的数据块。请参阅更改后的答案。我自己也忘了,这证明了我的观点。滚动您自己的HTTP库是不值得的。我已经尝试过了,但是我的console.log在另一个文件中甚至没有被点击。