[英]Promise function in separate file
我可以讓此函數在一個文件中工作,但我想通過分成多個文件來保持事物整潔。
// 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);
});
它更簡單並且有效。 如果除了使用模塊可以解決問題以外,還有其他解決方法,請告知並發布! 謝謝所有發布和幫助的人!
您創建的承諾應使用響應中的數據進行解析。
// 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請求的多樣化是一個已解決的問題。 我強烈建議您使用一個可用的庫,而不要滾動您自己的代碼,這些代碼會再次導致所有錯誤。
const request = require('request-promise');
const instagramSelfUrl = 'https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token;
module.exports = {
get: () => request(instagramSelfUrl)
};
現在,該功能已完成並且即使在極少數情況下也可以正常運行。 它太短了,以至於幾乎沒有理由編寫一個單獨的函數。
看來您沒有正確返回數據,請嘗試以下操作:
// 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))
});
}
}
有關承諾的更多信息,請訪問https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.